我有两个实体:第一人(表人);
@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
}
和类 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
}
如您所见,两个实体都处于一对多关系中。我想创建另一个类:
public class PersonAndCompany{
private String personName;
private String companyName;
private int emailCount;
//... constuctors
//... getters setters
}
我想编写 typequery 来填充 PersonAndCompany.class 字段,其中包含人名和 companyName(另一个类)和电子邮件计数,其中人员电子邮件计数超过 2。我想使用标准 api。我写了一些代码,但我不知道如何在 PersonAndCompany.class 中添加条件并填写 emailcount。
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();