我正在寻找从contentelementtypeproperty中检索所有行的情况WHERE testunittypeid为null或者testunittypeid = [给定长值]
下面显示的方法返回0结果。
然而,如果我删除: 任
.add(Restrictions.isNull("testUnitType"));
或
cr.createCriteria("testUnitType")
.add(Restrictions.eq("id", tutId));
我得到了结果(但显然不是我需要的所有行)。
我如何将这两者结合起来,以便他们根据不同的createCriteria调用创建OR标准?
@Transactional(propagation = Propagation.MANDATORY)
public List<ContentElementTypeProperty> getContentElementTypePropertiesForTut(Long businessId, Long tutId)
throws TestStructureException
{
SS.getLogger().debug("getContentElementTypePropertiesForTut business id:"+businessId +" tutid: "+tutId);
try
{
Session session = this.sessionFactory.getCurrentSession();
Criteria cr = session.createCriteria(ContentElementTypeProperty.class)
.add(Restrictions.isNull("testUnitType"));
cr.createCriteria("testUnitType")
.add(Restrictions.eq("id", tutId));
cr.createCriteria("business").add(Restrictions.eq("id", businessId));
List<ContentElementTypeProperty> result = cr.list();
SS.getLogger().debug("getContentElementTypePropertiesForNullTutOnly result size:"+result.size());
return result;
}
catch (Exception e)
{
SS.getLogger().error(e.getMessage(), e);
throw new TestStructureException(e);
}
}
更新 根据Malagunna的建议,我尝试使用标准(下面)。但是,这只返回crAux2的行。
Criteria cr = session.createCriteria(ContentElementTypeProperty.class);
cr.createAlias("testUnitType", "tut");
Criterion crAux1 = Restrictions.isNull("testUnitType");
Criterion crAux2 = Restrictions.eq("tut.id", tutId);
cr.add(Restrictions.or(crAux1, crAux2));
答案 0 :(得分:1)
我相信你的问题是你没有使用DISJUNCTION来结合这两种限制。
试试这个:
....
Session session = this.sessionFactory.getCurrentSession();
//Here it starts my solution
Criteria cr = session.createCriteria(ContentElementTypeProperty.class);
Criterion crAux1 = Restrictions.isNull("testUnitType");
Criterion crAux2 = cr.createCriteria("testUnitType")
.add(Restrictions.eq("id", tutId));
cr.add(Restrictions.or(crAux1, crAux2));
//Here it ends my solution
cr.createCriteria("business").add(Restrictions.eq("id", businessId));
....
我不完全确定crAux2
我之前想要测试它,但如果这不起作用,那么我首先创建一个别名testUnitType
,然后重写{{ 1}}到
crAux2
我一直在重读hibernate标准文档,也许这种方法解决了你的问题:
Criterion crAux2 = Restrictions.eq("alias.id", tutId);
此示例直接取自Hibernate docs,并按字面说明:
这将返回所有的Cats,其名字以&#34; good&#34;由他们的配偶年龄和所有没有配偶的猫订购。
所以,那就是说,我认为你可以用这种方式改变你的方法:
createAlias("mate", "mt", Criteria.LEFT_JOIN, Restrictions.like("mt.name", "good%") );
它更简单,它意味着与分离样本相同。
希望它有所帮助!