2015-09-26 42 views
1

我正在嘗試使用休眠創建以下查詢。構建一個存在的子查詢與休眠

select * from item 
where exists (
    select 1 
    from metadatavalue mv 
    where mv.dspace_object_id=item.uuid 
    and text_value='No Date' 
); 

我有困難使用hibernate對象構造子查詢。

下面的代碼爲我工作

Session session = (Session) context.getDBConnection().getSession(); 
Criteria criteria = session.createCriteria(Item.class, "item"); 
criteria.add(Restrictions.sqlRestriction("exists (select 1 from metadatavalue mv where mv.dspace_object_id=this_.uuid and text_value='No Date')")); 

我想創建此查詢與Hibernate對象。

Session session = (Session) context.getDBConnection().getSession(); 
Criteria criteria = session.createCriteria(Item.class, "item"); 
DetachedCriteria subcriteria = DetachedCriteria.forClass(MetadataValue.class); 
subcriteria.add(???) 
criteria.add(Subqueries.exists(subcriteria)); 

我不確定從子查詢中引用item.uuid(屬性名稱「id」)的正確方法。

如果我嘗試以下

Criteria criteria = session.createCriteria(Item.class, "item"); 
DetachedCriteria subcriteria = DetachedCriteria.forClass(MetadataValue.class,"mv"); 
subcriteria.add(Property.forName("mv.dspace_object_id").eqProperty("item.uuid")); 
criteria.add(Subqueries.exists(subcriteria)); 
System.out.println("xx" + criteria.list().size()); 

我收到以下錯誤

java.lang.NullPointerException 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:401) 
    at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:152) 
    at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:68) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:419) 
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:123) 
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:92) 
    at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:95) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1604) 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) 
    at org.dspace.core.Test.main(Test.java:37) 

[

+1

還不測試,但這個答案似乎是相關的:http://stackoverflow.com/questions/23519115/hibernate-criteria-with-exists-clause –

+0

@BramLuyten,我所見到的例子,但我無法爲我的例子工作。我添加了更多的細節來說明我收到的錯誤。 – terrywb

+1

您需要在已確定的條件上設置投影,以僅選擇一列:例如,「subcriteria.setProjection(Projections.id())」。 –

回答

0

每上述建議,我用的屬性名稱,而不是列名和我增加了投影。這解決了這個問題。

Criteria criteria = session.createCriteria(Item.class, "item");  
DetachedCriteria subcriteria = DetachedCriteria.forClass(MetadataValue.class,"mv"); 
subcriteria.add(Property.forName("mv.dSpaceObject").eqProperty("item.id")); 
subcriteria.setProjection(Projections.property("mv.dSpaceObject")); 
criteria.add(Subqueries.exists(subcriteria)); 
System.out.println("xx" + criteria.list().size());