我的代碼是:ORA-01791 Hibernate查詢
Criteria criteriaA = getHibernateSession().createCriteria(entityA.class, "aaa");
Criteria criteriaB = criteriaA.createCriteria("entityB").setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); // It seems that the result transformer don't affect the code...
criteriaA.add(-- some restriction --)
if (orderById) {
criteriaB.addOrder(Order.desc("id"));
}
if (!orderById && orderByDate) {
criteriaB.addOrder(Order.desc("date"));
}
criteriaA.setProjection(Projections.distinct(Projections.property("entityB")));
entityA和entityB有一個一對多扯上關係(一個entityB可以有0 .. * entityA),但我可以從只有B轉到A(限制項目..不能改變這一點)。
現在,問題是我不需要重複的結果返回,我需要排序我的結果。
奇怪的事實是,ORA-01791(它告訴我,有一個不正確的orderby)我只在按日期排序時啓動,按id排序不會給我任何問題,但都是我想要區分的實體的屬性!
爲什麼我可以按ID排序但不是按日期?
是否有另一種方法來做我想做的事情?
----編輯-----
正如莫比建議我看着生成的查詢:
DEBUG [org.hibernate.SQL]
select distinct this_.BBB_ID as y0_
from TB_ENTITY_A this_
inner join TB_ENTITY_B entityB_ on this_.BBB_ID=entityB_.BBB_ID
where this_.ANOTHER_ID=? and lower(this_.AAA_VALUE) like ? and this_.AAA_ID in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
order by entityB_.BBB_DATE asc
所以,我分明只有外鍵的ID應用..
我如何強制Hibernate選擇所有的字段?
如果我做的:
criteriaB.list();
,而不是
criteriaA.list():
我將失去從criteriaA過濾器?
我在想也試圖在Projection中設置所有來自entityB的字段,但我不確定hibernate是否可以將結果轉換爲實體。
+1爲解決方案,是我自己會提出一個子選擇。你也可以把它當作自己的答案。 – mabi
對,現在我已經完成:) –