Hibernate Criteria在第二个表上连接两个带条件的表,并得到第一个表

时间:2011-04-06 22:21:48

标签: java hibernate criteria

我有一个使用Hibernate Criteria的问题,我需要使用条件转换此查询。

SELECT * FROM A a_ INNER JOIN B b_ ON a_.column1 = b_.column1 AND b_.column2 IN(X,Y)AND active ='Y';

我需要结果作为表A。

2 个答案:

答案 0 :(得分:1)

如果已定义关联,请参阅http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-associations

如果未在实体定义中指定关联,则不能使用条件。 您可以使用HQL进行内部联接(需要在implicit join notation中编写),对于左联接,您必须使用本机SQL。

答案 1 :(得分:1)

我刚刚解决了这个问题,这是我的代码

        Criteria criteria = session.createCriteria(ProductOffer.class);
        criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

        Date effDate = TypeConvertUtil.toDate(param.get("effDate"));

        criteria.add(Restrictions.le("effDate", effDate));
        criteria.add(Restrictions.gt("expDate", effDate));


        criteria.createAlias("productOfferPropDefs", "def",JoinType.LEFT_OUTER_JOIN);
        criteria.setFetchMode("productOfferPropDefs", FetchMode.JOIN);
        criteria.add(Restrictions.le("def.effDate", effDate));
        criteria.add(Restrictions.gt("def.expDate", effDate));


        criteria.createAlias("def.productOfferProps", "prop",JoinType.LEFT_OUTER_JOIN);
        criteria.setFetchMode("def.productOfferProps", FetchMode.JOIN);
        criteria.add(Restrictions.le("prop.effDate", effDate));
        criteria.add(Restrictions.gt("prop.expDate", effDate));

        productOfferList = criteria.list();

请注意

criteria.createAlias("productOfferPropDefs", "def",JoinType.LEFT_OUTER_JOIN);

这个参数很重要:

JoinType.LEFT_OUTER_JOIN

如果你没有使用它,并且你的关系是一对多的,它将会出现1:N经典的hibernate问题