具有基本值集合的Hibernate条件查询

时间:2014-09-24 14:23:08

标签: java database hibernate criteria

我是Hibernate的新手,特别是在Criteria API中,我无法在我的问题上找到答案。 这是简化的域类:

@Entity
public class HDNewsPost implements Serializable {
    @Id
    private Long id;

    //other fields
    //..    

    @ElementCollection
    @CollectionTable(name = "SD_SOLUTION.PBITSM_HD_NEWS_RECIPIENT_CODES",
            joinColumns = @JoinColumn(name = "POST_ID"))
    @Column(name="POSITION_CODE")
    private List<String> recipientCodes;

    //getters and setters
}

如果在recipientCodes集合中存在某些值(字符串代码),我需要限制满足的条件。

1 个答案:

答案 0 :(得分:1)

我解决了我的任务!这是完整的标准查询,其中包含我遇到问题的部分:

final Criteria criteria = sessionFactory.getCurrentSession().createCriteria(HDNewsPost.class);
criteria.setFirstResult(startFrom);
criteria.setMaxResults(maxResults);
criteria.addOrder(Order.desc("publicationDate"));

if (code != null) {
    criteria.createAlias("recipientCodes", "rc", CriteriaSpecification.LEFT_JOIN);
    criteria.add(Restrictions.or(Restrictions.isEmpty("recipientCodes"),
        Restrictions.eq("rc.elements", code)));
}

return criteria.list();

我在这里找到答案https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch17.html#querycriteria-collections

&#34;对于queryng基本值的集合,我们仍然会针对集合创建Criteria对象,但是要引用该值,我们使用特殊属性&#34;元素&#34; 。对于索引集合,我们还可以使用特殊属性&#34; indices&#34;来引用索引属性。&#34;

此外,在创建别名时,您需要指定sql LEFT_JOIN(默认为INNER_JOIN),否则您可能无法获得预期的结果。