我是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集合中存在某些值(字符串代码),我需要限制满足的条件。
答案 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),否则您可能无法获得预期的结果。