0

我想用一个标准搜索我的数据库。多个字段的示例,或者一起。也就是说,我想检索其中“field1”是我的搜索对象的示例或“field2”是我的搜索对象的示例的记录,其中 field1 和 field2 是顶级对象的子对象,并且每个对象都是相同的类型作为我的搜索对象。

我想做的是

 Disjunction or = Restrictions.disjunction(); 
 or.add(criteria.createCriteria("field1").add(searchObj));
 or.add(criteria.createCriteria("field2").add(searchObj)); 
 criteria.add(or); 

这不起作用,因为 Disjunctions 仅适用于 criteri on而不是 criteri a

我试过了

 Disjunction or = Restrictions.disjunction(); 
 or.add(Restrictions.eq("field1", searchObj));
 or.add(Restrictions.eq("field2", searchObj));
 criteria.add(or); 

但这给了我一个关于对象主键的 PropertyAccessException,说

 IllegalArgumentException occurred calling getter of [.....].pk

有没有办法通过示例子句之间的分离来做 QBE?

4

1 回答 1

0

我通过使用 DetachedCriteria 和子查询解决了这个问题:

DetachedCriteria f1Crit = DetachedCriteria.forClass(SearchObj.class, "field1");
f1Crit.add(searchObj); 
f1Crit.setProjection(Property.forName("id"));

DetachedCriteria f2Crit = DetachedCriteria.forClass(SearchObj.class, "field2");
f2Crit.add(searchObj); 
f2Crit.setProjection(Property.forName("id"));

criteria.add(
    Restrictions.or(
        Subqueries.propertyIn("field1.id", f1Crit),
        Subqueries.propertyIn("field2.id", f2Crit))
    ); 
于 2017-01-05T19:27:02.270 回答