Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用hibernate构造where-exists子查询_Hibernate_Dspace - Fatal编程技术网

用hibernate构造where-exists子查询

用hibernate构造where-exists子查询,hibernate,dspace,Hibernate,Dspace,我正在尝试使用hibernate创建以下查询 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().getSessi

我正在尝试使用hibernate创建以下查询

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");
DetachedCriteria subcriteria = DetachedCriteria.forClass(MetadataValue.class);
subcriteria.add(???)
criteria.add(Subqueries.exists(subcriteria));
以下代码适用于我

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)
java.lang.NullPointerException
位于org.hibernate.loader.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:401)
位于org.hibernate.criteria.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:152)
位于org.hibernate.criteria.SubqueryExpression.toSqlString(SubqueryExpression.java:68)
位于org.hibernate.loader.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:419)
位于org.hibernate.loader.criteria.CriteriaJoinWalker(CriteriaJoinWalker.java:123)
位于org.hibernate.loader.criteria.CriteriaJoinWalker(CriteriaJoinWalker.java:92)
位于org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:95)
位于org.hibernate.internal.SessionImpl.list(SessionImpl.java:1604)
位于org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
位于org.dspace.core.Test.main(Test.java:37)

[

根据上述建议,我使用了属性名而不是列名,并添加了投影。这解决了问题

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());

还没有测试,但这个答案似乎是相关的:@BramLuyten,我已经看到了这个例子,但我无法让这个例子对我起作用。我添加了更多细节来说明我收到的错误。你需要在检测到的标准上设置一个投影,只选择一列:
subcriteria.setProjection(Projections.id())
例如。