Как в JPA включить в запрос предложение count?

Я использую JPA 2.0 и Hibernate 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
  • Дэйв

person Dave    schedule 18.06.2014    source источник


Ответы (1)


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

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

person JB Nizet    schedule 18.06.2014