【问题标题】:Constructing a where exists subquery with hibernate使用 hibernate 构造 where exists 子查询
【发布时间】:2015-09-26 00:07:49
【问题描述】:

我正在尝试使用休眠创建以下查询。

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

我在使用休眠对象构造子查询时遇到了困难。

以下代码对我有用

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')"));

我想用休眠对象创建这个查询。

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)

[

【问题讨论】:

  • 还没有测试,但这个答案似乎是相关的:stackoverflow.com/questions/23519115/…
  • @BramLuyten,我看过那个例子,但我无法让这个例子适合我。我添加了更多细节来说明我收到的错误。
  • 您需要在 deteched 标准上设置一个投影,以仅选择一列:例如subcriteria.setProjection(Projections.id())

标签: hibernate dspace


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2010-12-08
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多