2016-01-22 69 views
1

我在使用Hibernate Criteria API時非常奇怪的Hibernate行爲。我正在使用休眠4.3.6最終。 我有一類AnnouncementAttribute這樣的:EmbeddedId屬性上的Hibernate標準拋出org.hibernate.QueryException:無法解析屬性

@Entity 
@Table(name = "announcement_attribute") 
public class AnnouncementAttribute implements Serializable { 

    @EmbeddedId 
    protected AnnouncementAttributePK id; 

    @Column(name = "attribute_value") 
    private String attributeValue; 
} 

和AnnouncementAttributePK類下面:

@Embeddable 
public class AnnouncementAttributePK implements Serializable { 
    @ManyToOne 
    @JoinColumn(name = "attribute_id") 
    private Attribute attr; 

    @ManyToOne 
    @JoinColumn(name = "announcement_id") 
    private Announcement announcement; 
} 

和屬性類:

@Entity 
@Table(name = "attribute") 
public class Attribute implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "attribute_type") 
    private Integer attributeType; 

    @Column(name = "attribute_name") 
    private String attributeName; 
} 

我這裏ommitted getter/setter方法。

問題是,當我嘗試通過標準API訪問@EmbeddedId屬性ATTR:

Criteria ac = session().createCriteria(AnnouncementAttribute.class); 
ac.add(Restrictions.and(
        Restrictions.eq("id.attr.attributeName", "someKey"), 
        Restrictions.eqOrIsNull("attributeValue", "someValue"))); 

我越來越:

org.hibernate.QueryException:無法解析屬性:ID。 attr.attributeNameName:com.example.app.domain.AnnouncementAttribute

我已經嘗試爲embeddedId創建一個別名 - 仍然沒有運氣。

回答

0

嘗試

Criteria ac = session().createCriteria(AnnouncementAttribute.class) 
.createAlias("id", "id") 
.createAlias("id.attr", "idAttr") 
.add(Restrictions.and(
        Restrictions.eq("idAttr.attributeName", "someKey"), 
        Restrictions.eqOrIsNull("attributeValue", "someValue"))); 
+0

我想這樣的做法,我越來越:org.hibernate.QueryException:標準的對象不能在組件中直接創建。在擁有實體上創建條件並使用虛線屬性訪問組件屬性:id –

1

好,altough我不相信我要找到解決辦法,我會發布反正它,也許有人會覺得它有用或也許這將是進一步討論的好題材。

我刪除@Embedded從AnnouncementAttributePK

public class AnnouncementAttributePK implements Serializable { 
    @ManyToOne 
    @JoinColumn(name = "attribute_id") 
    private Attribute attr; 

    @ManyToOne 
    @JoinColumn(name = "announcement_id") 
    private Announcement announcement; 
} 

,然後在AnnouncementAttribute我已經改變了@EmbeddedId到@IdClass @Id和組合:

@Entity 
@Table(name = "announcement_attribute") 
@IdClass(AnnouncementAttributePK.class) 
public class AnnouncementAttribute implements Serializable { 

    @Id 
    private Attribute attr; 
    @Id 
    private Announcement announcement; 

    @Column(name = "attribute_value") 
    private String attributeValue; 
} 

終於在標準:

Criteria ac = session().createCriteria(AnnouncementAttribute.class) 
      .createAlias("attr", "atrib"); 
ac.add(Restrictions.and(
        Restrictions.eq("atrib.attributeName", "someKey"), 
        Restrictions.eqOrIsNull("attributeValue", "someValue"))); 

經過這些變化,一切正常。我不知道爲什麼......我會進一步調查它,因爲這至少是奇怪的。也許它與我的應用程序在Spring Context中運行,使用LocalContainerEntityManagerFactoryBean和spring-data-jpa,以及org.hibernate.Session對象是通過展開EntityManager來獲得有關? :

@PersistenceContext 
private EntityManager entityManager; 

和會話:

private Session session(){ 
    return entityManager.unwrap(Session.class); 
} 
+0

您是否知道正確的解決方案?我現在面臨同樣的問題。我創建別名。現在我得到//org.hibernate.QueryException:Criteria對象不能直接在組件上創建。在擁有實體上創建條件,並使用虛線屬性訪問組件屬性//異常。但我不認爲你的解決方案是正確的 – Ratha

相關問題