鉴于以下实体,如何构建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=?
不在类别表附近。
我问,因为我想避免在我需要的时候创建或检索一个新的Category实例,这是我已经拥有的ID。
感谢您的帮助!
答案 0 :(得分:2)
我最终使用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();