实体列表的 CriteriaBuilder 和 isMember (Hibernate)

Posted

技术标签:

【中文标题】实体列表的 CriteriaBuilder 和 isMember (Hibernate)【英文标题】:CriteriaBuilder and isMember of list on entity (Hibernate) 【发布时间】:2012-12-20 23:17:20 【问题描述】:

好的,我正在尝试做一些很奇怪的事情。我正在尝试使用 CriteriaBuilder 和 CriteriaQuery 返回包含实体集合中给定对象的所有实体。几个小时以来,我一直在努力解决这个问题,相关文档很少,也不是特别有用。任何帮助将不胜感激。

相关类摘录如下。

@Entity
public class Entry 
    @ManyToMany(fetch=FetchType.EAGER)
    private List<Tag> tags = new ArrayList<Tag>();


@Entity
public class Tag 
    @Size(min=1,max=63)
    @Column(unique=true)
    @NotNull
    private String name;


@Repository
@Transactional
public class EntryDaoImpl extends RefineableDao implements EntryDao
    @Autowired
    private EntityManager em;

    @Override
    public List<Entry> search(final Map<String,Object> refinement)
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Entry> query = cb.createQuery(Entry.class);
        Root<Entry> entry = query.from(Entry.class);
        query.orderBy(cb.desc(entry.get("createTime")));
        query.select(entry);
        query.where(this.refineQuery(refinement, cb, query, entry));
        return em.createQuery(query).getResultList();
    

所以基本上,我需要能够找到包含给定标签的条目。我知道如果这是我正在做的唯一改进,这可以很简单地完成,但是对同一个 CriteriaQuery 进行了许多其他改进,我从不保证会进行哪些改进。

如果您确实需要了解后端,请查看 http://pastebin.com/QJnkYRRh 。这是一个可怕的未注释的混乱。

【问题讨论】:

【参考方案1】:

好的。我找到了为什么我在使用 CriteriaBuilder.isMember() 时遇到问题的答案。问题是Path 必须是Path&lt;? extends Collection&gt;。这样,isMember() 就像我希望的那样工作。

【讨论】:

以上是关于实体列表的 CriteriaBuilder 和 isMember (Hibernate)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CriteriaBuilder 的多个 JOIN 来构建 Predicate?

如何通过两个字段加入(CriteriaBuilder)

使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列

在 criteriaBuilder 加入不想正常工作

在相同的事务方法中使用 CriteriaBuilder JPA 插入和更新错误“外键不存在”

如何在 JPA Criteriabuilder Select 语句中执行子查询?