criteribuilder Predicate是只使用实体ID的member



给定以下实体,我如何构造一个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 );
}

但我的问题是:我可以只使用类别吗?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,我已经有了。

谢谢你的帮助!

我最终用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();

最新更新