gpt4 book ai didi

hibernate - CriteriaBuilder 谓词 isMember 仅使用实体 ID

转载 作者:行者123 更新时间:2023-12-02 23:08:06 33 4
gpt4 key购买 nike

给定以下实体,如何构造 JPA 谓词以仅选择那些在其类别集中具有给定 ID 的类别的项目?

@Entity
public class Item
{
@Id
private String id;

private String name;

@JoinTable(name="category_items",
joinColumns={@JoinColumn(name="item_id")},
inverseJoinColumns={@JoinColumn(name="category_id")})
private Set<Category> categories;

/* etc */
}

@Entity
public class Category
{
@Id
private String id;

private String name;

/* etc */
}

我想如果我有 Category 对象就可以做到:

Predicate buildPredicate( CriteriaBuilder cb, Root root, Category category )
{
Expression<Collection<Category>> categories = root.get( "categories" );
return cb.isMember( category, categories );
}

但我的问题是:我可以仅使用 Category.id 字符串来完成此操作吗?在 SQL 中,它会类似于

SELECT item.id, item.name FROM item JOIN category_items ON item.id = category_items.item_id WHERE category_items.category_id=?

它不靠近类别表。

我问这个问题是因为我想避免在我需要的只是我已经拥有的 ID 时创建或检索新的 Category 实例。

感谢您的帮助!

最佳答案

我最终使用 join 而不是 isMember 解决了这个问题:

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Item> cq = cb.createQuery( Item.class );
Root from = cq.from( Item.class );
From join = from.join( "categories" );
Path<Item> p = join.get( "id" );
Predicate predicate = cb.equal( p, "my_category_id" );
cq.where( predicate );
cq.select( from );
TypedQuery<Item> typedQuery = em.createQuery( cq );
List<Item> resultList = typedQuery.getResultList();

关于hibernate - CriteriaBuilder 谓词 isMember 仅使用实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16739978/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com