В JPA, как мне включить предложение «count» в мой запрос?

#hibernate #jpa #jpa-2.0 #hibernate-4.x

#спящий режим #jpa #jpa-2.0 #спящий режим-4.x

Вопрос:

Я использую JPA 2.0 и гибернацию 4.1.0.Final. У меня есть следующие объекты:

 @Entity
@Table(name = "group")
public class Group    
{
    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "ID")
    private String id;
    …


    @OneToMany(mappedBy = "group")
    private Set<GroupMember> members;



@Entity
@Table(name = "sb_msg_group_member")
public class GroupMember
{
    …

    @ManyToOne
    @JoinColumn(name = "USER_ID", nullable = false, updatable = true)
    private User user;
  

Как мне написать запрос CriteriaBuilder (НЕ JPQL), в котором я хочу найти группу с определенным количеством участников? Я попробовал следующее:

     final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
    CriteriaQuery<Group> criteria = builder.createQuery(Group.class);
    final List<Predicate> predicates = new ArrayList<Predicate>();
    final Root<Group> group = criteria.from(Group.class);
    predicates.add(builder.equal(builder.count(group.get(Group_.members)),users.size()));
    criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
    final TypedQuery<Group> results = m_entityManager.createQuery(criteria);
  

Но SQL приводит к грамматическому исключению, производящему …

 select group0_.ID as ID70_, group0_.CLASSROOM_ID as CLASSROOM3_70_, group0_.NAME as NAME70_, group0_.CREATOR as CREATOR70_ from group group0_ cross join group_member members1_ where group0_.ID=members1_.GROUP_ID and count(.)=2
  
  • Дэйв

Ответ №1:

 predicates.add(builder.equal(builder.size(group.get(Group_.members)), users.size()));
  

вероятно, это то, что вам нужно.