我正在寻求从contentelementtypeproperty检索TestInitTypeId为空或TestInitTypeId=[给定长值]的所有行
下面显示的方法返回0个结果。
但是,如果我删除:要么
.add(Restrictions.isNull("testUnitType"));
或
cr.createCriteria("testUnitType")
.add(Restrictions.eq("id", tutId));
我得到了结果(但显然不是我需要的所有行)。
如果每一个都是在不同的createCriteria调用下创建的,那么我如何组合这两个,以便它们生成一个或条件?
@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));
我相信你的问题是你没有使用析取来组合这两个限制。
试试看:
....
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
创建一个别名,然后重写craux2
以
Criterion crAux2 = Restrictions.eq("alias.id", tutId);
我一直在重新阅读hibernate标准文档,也许这个方法解决了您的问题:
createAlias("mate", "mt", Criteria.LEFT_JOIN, Restrictions.like("mt.name", "good%") );
这个示例直接取自Hibernate文档,它的字面意思是:
这将返回所有有配偶的猫,其名字以“好”开头,按其配偶的年龄排序,以及所有没有配偶的猫。
所以,我认为你可以这样改变你的方法:
....
Session session = this.sessionFactory.getCurrentSession();
//Here it starts my solution
Criteria cr = session.createCriteria(ContentElementTypeProperty.class);
cr.createCriteria("testUnitType", "tut", Criteria.LEFT_JOIN, Restrictions.eq("tut.id", tutId));
//Here it ends my solution
cr.createCriteria("business").add(Restrictions.eq("id", businessId));
....
它更直接,它的意思是相同的析取样本。
希望有帮助!
subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。
问题内容: 考虑以下两个关系: 连接表ATag没有相应的实体类。现在,我想获取所有名为Tag1的Tag的Foo实例,是否可以仅使用Criteria? 子查询可能会有所帮助,但是,我无法为不存在的类ATag.class创建DetachedCriteria。 问题答案: 只是处理这个确切的问题。您在表中而不是对象中思考。只是参考,让Hibernate负责其余的工作: 如果您看到SQL Hibernat
问题内容: 可以使用Hibernate标准吗? 问题答案: 我遇到了完全相同的问题,并能够像这样解决它: 注:,和在上面的代码指在属性名,和类,相应地(类具有属性等)。 对于此解决方案,您甚至不需要在中设置和参数。
问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用休眠标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 对于简短的解释,请参考此问题,如何使用struts2-jqgrid插件在jqgrid
我想使用Hibernate条件语言编写此查询。我对Hibernate很陌生,无法将此查询转换为条件形式。我参考了很多关于 SO 的答案,但就我而言,我在不同的列上使用内部连接而不是主键/外键列。我提到了这个,但仍然不能正确。
问题内容: 使用hibernate条件时,仅更改联接类型会影响根域类的子级集合的结果。 例如,让Parent类与Child类具有一对多关系,并具有以下数据: 使用以下hibernate条件返回1父行,访问子集合结果将返回两行: 但是,当通过左连接更改上述代码时,将返回1父行,但是在访问子集合时仅返回匹配的子行。 为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,具体取决于您的预期