当前位置: 首页 > 知识库问答 >
问题:

对联接列的Hibernate条件限制

长孙星汉
2023-03-14
  • 我的Hibernate bean ContentElementTypeProperty引用了另一个Hibernate bean TestUnitType(多对一)。
  • TestUnitType是ContentElementTypeProperty的字段。
  • 数据库中,testunittypeid是表ContentElementTypeProperty中的一列。

我正在寻求从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));

共有1个答案

汪耀
2023-03-14

我相信你的问题是你没有使用析取来组合这两个限制。

试试看:

....
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父行,但是在访问子集合时仅返回匹配的子行。 为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,具体取决于您的预期