我想要实现的目标: 选择具有值列表中存在的属性值的实体的susbset。此列表由另一个查询返回。
在纯SQL中,使用子查询可以轻松实现这一点。这是Criteria查询,它返回相关值:
DetachedCriteria subq = DetachedCriteria.forClass(MyClass.class)
.setProjection(
Projections.projectionList()
.add(Projections.alias(Projections.max("interestingVal"), "interestingVal"))
.add(Projections.groupProperty("someval1"))
.add(Projections.groupProperty("someval2"))
.add(Projections.groupProperty("someval3"))
);
然后,我想选择具有上述查询返回的interesting_val值的实体。像这样:
List<MyClass> resultList = sessionFactory.getCurrentSession().createCriteria(MyClass.class)
.add(Subqueries.propertyIn("interestingVal", subq))
.list();
不幸的是,subq
子查询返回长度为4的对象数组列表,因为我有4个Projection值。所有投影值似乎都自动添加到SELECT子句中。这导致了
SQLSyntaxErrorException: ORA-00913: too many values
。
如何告诉我的第二个Criteria查询只使用Object数组中的第一个元素或仅检索子查询中的第一列?
答案 0 :(得分:0)
而不是 propertyIn 尝试 propertiesIn 。
String[] vals = new String[]{"interestingVal", "someval1", "someval2", "someval3"};
List<MyClass> resultList = sessionFactory.getCurrentSession().createCriteria(MyClass.class)
.add(Subqueries.propertiesIn(vals, subq))
.list();