2012-04-27 122 views
0

我想用CriteriaBuilder爲這種sql創建一個查詢;CriteriaBuilder和使用別名選擇原因

SELECT myDefinedAlias.id, myDefinedAlias.name, myDefinedAlias.aFieldForFK select from Person as myDefinedAlias where myDefinedAlias.name = ?1 

我該如何完成爲此定義別名?

我可以創建一個沒有別名查詢,但我不能定義別名...

CriteriaQuery<Person> cq = criteriBuilder.createQuery(Person.class); 
Root<Person> person = cq.from(Person.class); 
cq = cq.select(person); 
cq = cq.where(criteriaBuilder.equal(person.get(Person_.name), "Chivas"))) 

我需要這個QueryHints,批量抓取。

.setHint(QueryHints.BATCH, "myDefinedAlias.aFieldForFK.itsNestedAttribute"); 

我被卡住了,找不到任何關於我的問題。任何人?

Regards

回答

0

我認爲你是這樣做的錯誤方式。當生成sql語句時,JPA需要sql-statement-aliases來使用它自己。 要使嵌套查詢提示生效,需要在實體中指定關係。 例如,如果您的Person實體具有到House實體的OneToMany映射 - 並且Person類中的屬性名稱是livedInHouses。查詢提示將變爲: .setHint(QueryHints.BATCH,「Person.livedInHouses」)。它該死的幾乎不可能使用數據庫中存在的FK,但不會註釋爲JPA實體中的關係。

+0

對不起延遲迴復...是的,你是對的。我檢查了是否可以通過「Person」註釋獲取,並且它是正確的。我不得不改變我構建查詢的方式。謝謝你的幫助! – 2012-04-29 21:20:35

1

cq.select(person).alias("myDefinedAlias")分配您的別名,隨後可以用於批處理/提取查詢提示。只要您不轉移到許多關係(集合),Eclipselink支持嵌套的提取聯接。 也就是說.setHint(QueryHints.BATCH, myDefinedAlias.toOneRelation.toManyRelation")作品,而.setHint(QueryHints.BATCH, .setHint(QueryHints.BATCH, "myDefinedAlias.toManyRelation.toOneRelation")不應該。