连接列的Hibernate条件限制

时间:2015-11-06 07:01:37

标签: hibernate hibernate-criteria

  • 我的Hibernate bean ContentElementTypeProperty引用另一个Hibernate Bean TestUnitType(多对一)。
  • TestUnitType是ContentElementTypeProperty的字段。
  • 在数据库中,testunittypeid是表中的一列 contentelementtypeproperty。

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

1 个答案:

答案 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%") );

它更简单,它意味着与分离样本相同。

希望它有所帮助!