2013-11-04 45 views
0

我目前正忙於使用JPA Criteria API創建查詢。我想動態構建我的查詢。使用元模型和類型查詢對我來說是沒有選擇的。 假設我有以下實體:Criteria API join untyped:查詢來自相關實體的值(一對多)

@Entity 
@Table(name = "MYENTITY") 
public class MyEntity { 
... 
    @OneToMany(mappedBy = "myEntity", fetch = FetchType.LAZY) 
    private Set<MyRelatedEntity> myRelatedEntities; 
... 
} 

@Entity 
@Table(name = "MYRELATEDENTITY") 
public class MyRelatedEntity { 
... 
    @ManyToOne 
    @JoinColumn(name = "MYENTITY", nullable = false) 
    private MyEntity myEntity; 
... 
} 

我嘗試用「myEntity所」加入查詢到「MyRelatedEntity」字段:

CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); 
    Root<MyEntity> root = query.from(MyEntity.class); 
    root.join("myRelatedEntities"); 
    query.select(builder.array(root.get("myRelatedEntities").get("name"))); 
    Query queryCriteria = em.createQuery(query); 
    List<Object[]> resultRows = queryCriteria.getResultList(); 

resultRows是一個空的列表,儘管下面的查詢直接在數據庫給我的結果:

Select myrelent.name from MYENTITY myent, MYRELATEDENTITY myrelent where myent.id = myrelent.myentity; 

我的查詢與標準API構建的有什麼問題?任何幫助表示讚賞!

+0

問題是...? – Taylor

+0

如果你反正無類型化,爲什麼不使用JPQL併爲自己節省一個PITA? – kostja

+0

@kostja:如果字符串「名稱」是動態生成的,這是非常有意義的。 – perissf

回答

0

您不需要指示CriteriaBuilder返回一個Array:無論如何它都會執行正確的工作。所以,簡單地改變返回類型爲String和select語句:

CriteriaQuery query = builder.createQuery(String.class); 
Root<MyEntity> root = query.from(MyEntity.class); 
query.select(root.get("myRelatedEntities").get("name")); 
Query queryCriteria = em.createQuery(query); 
List<String> resultRows = queryCriteria.getResultList(); 

無關:關於加入,使加入的標準方法是:

Join<MyEntity, MyRelatedEntity> related = root.join("myRelatedEntities"); 
query.select(related.get("name")); 

然而,它是很好的瞭解你的方式完全可以工作!

+0

使用連接對象(本例中的「相關」)來查詢其屬性可以解決我的問題。乾杯。 – user1335772

相關問題