I have got two entities: first Person (table person);
@Entity
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "name", nullable = false, length = 2147483647)
private String name;
@Column(name = "first_name", nullable = false, length = 2147483647)
private String firstName;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "peopleId")
private List<PeopleEmail> peopleEmailList;
//... constuctors
//... getters setters
}
And class PeopleEmail
@Entity
public class PeopleEmail implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@NotNull
@Column(name = "email", nullable = false, length = 2147483647)
private String email;
@JoinColumn(name = "people_id", referencedColumnName = "id", nullable = false)
@ManyToOne(optional = false)
private Person peopleId;
//... constuctors
//... getters setters
}
As you can see both entities are in the one-to-many relation. I want to create another class:
public class PersonAndCompany{
private String personName;
private String companyName;
private int emailCount;
//... constuctors
//... getters setters
}
And I would like to write typequery which fill PersonAndCompany.class field with person name and companyName (another class) and email count, where count of person emails is more than 2. I would like to use criteria api. I write some code but I don't know how to add condition where and fill emailcount in PersonAndCompany.class.
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<PersonAndCompany> cq = cb.createQuery(PersonAndCompany.class);
Root<Person> person = cq.from(Person.class);
Join<Person, Company> company = person.join(Person_.companyId);
cq.where(cb.greaterThan(cb.size(person.get(Person_.peopleEmailList)), 2));
Selection<PersonAndCompany> select = cb.construct(PersonAndCompany.class,
person.get(Person_.firstName),
company.get(Company_.name));
cq.select(select);
TypedQuery<PersonAndCompany> query = em.createQuery(cq);
return query.getResultList();