2013-05-08 28 views
1

提供程序是hibernate 3.6。如何在jpaql或hql查詢中使用組合鍵中的單列

我有一個通過@IdClass聲明的組合鍵,由4列組成。當涉及到通過完整主鍵存儲和檢索實體實例時,一切正常。但是,如果我希望查詢在一列中具有特定值的所有實體,hibernate會拋出異常。

@Entity 
@IdClass(MyBeanId.class) 
public class MyBean { 
    @Id 
    private Integer partId1; 
    @Id 
    private Integer partId2; 
    @Id 
    private Integer partId3; 
    @Id 
    private String partId4; 
    private Integer otherProperty1; 
    private Double otherProperty2; 
    private Double otherProperty3; 
    private String otherProperty4; 

     /* removed getters and setters */ 
} 

查詢代碼在另一個類中:

public List<MyBean> findByPartId1(Integer partId1) { 
    return em.createQuery("select b from MyBean b where b.partId1 = :partId1", MyBean.class).setParameter("partId1", partId1).getResultList(); 
} 

其失敗另一查詢,大約不知道的參數的類型的錯誤消息如下:

public List<Integer> getAllPartId1s() { 
    return em.createQuery("select distinct b.partId1 from MyBean b", Integer.class).getResultList(); 
} 

的異常我從第一個查詢得到如下:

Caused by: org.hibernate.QueryException: could not resolve property: partId1 of: some.company.entity.MyBean [select t from some.company.entity.MyBean b where b.partId1 = :partId1] 
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465) 
    at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:315) 
    at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487) 
    at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611) 
    at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263) 
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210) 
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117) 
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113) 
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:880) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1330) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4471) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3944) 

當然,有一些方法可以訪問查詢中組合鍵的各個列,而無需使用@Embeddable ID對象?否則,爲什麼即使有@IdClass機制,因爲它幾乎沒用。我嘗試了很多變體,比如「where b.id.partId1 =:partId1」,但都失敗了。

是的,我有一個MyBeanId類具有相同的屬性和有效的hashCode和等於,但只有很多代碼我想清理,以發佈問題。

+0

在你查詢'select b from MyBean b where t.partId1 =:partId1'你爲什麼提到't.partId1',不應該它是'b.partId1'或者它只是一個錯字。 – 2013-05-09 06:15:14

+0

MyBean上的任何查詢是否工作?即「從MyBean m中選擇m」?在MyBean上的任何其他屬性如何?或者它只是給您帶來麻煩的ID之一? – Chris 2013-05-09 13:38:15

+0

Nayan,是的,這是一個錯字。我改變了所有的名字和查詢,以便清理代碼,我錯過了那一個。查詢在我的實際代碼中是正確的。克里斯,查詢不參考作爲複合id的一部分屬性工作正常。 「從MyBean m中選擇m」工作正常,「從MyBean m中選擇m,其中m.otherProerty1 =:someValue」 – ideasculptor 2013-05-10 07:36:31

回答

0

我知道現在回答您的查詢爲時已晚(3年後)。另外,我使用的方式是使用@EmbeddedId而不是@IdClass,但只是認爲它可能會幫助其他人在這裏尋找對類似問題的答案。

你可以把所有的領域,包括你的組合鍵在不同的類,如下所示:

@Embeddable 
public class MyBeanId { 
private Integer partId1; 

private Integer partId2; 

private Integer partId3; 

private String partId4; 
} 

使用這個類在你的實體:

public class MyBean { 
@EmbeddedId 
private MyBeanId id; 
// other attrbute goes here 
} 

,然後編寫查詢爲:

public List<Integer> getAllPartId1s() { 
    return em.createQuery("select distinct b.id.partId1 from MyBean b".... 
} 
相關問題