Java JPA标准查询,如何加入实体-Hibernate-
我用hibernate做了一个JPA项目。它比这个复杂一点,但这里有两个类:Java JPA标准查询,如何加入实体-Hibernate-,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我用hibernate做了一个JPA项目。它比这个复杂一点,但这里有两个类: @Entity @Table(name= "Persons") public class Person { @Id @Column(nullable= false) @GeneratedValue(strategy = GenerationType.AUTO) protected Integer persId; @Column(nullable= false, length =
@Entity
@Table(name= "Persons")
public class Person {
@Id
@Column(nullable= false)
@GeneratedValue(strategy = GenerationType.AUTO)
protected Integer persId;
@Column(nullable= false, length = 50)
private String firstName;
@Column(nullable= false, length = 50)
private String surname;
@Column(nullable= true, length = 50)
private String emailAddress;
@OneToMany(orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE})
private List<PhoneNumber> phoneNumbers;
@OneToOne(mappedBy="person", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE})
private Account account;
//private Account account;
public Person() {
// empty
}
public Person(String firstName, String surname, String emailAddress) {
this.firstName = firstName;
this.surname = surname;
this.emailAddress = emailAddress;
}
public Integer getPersId() {
return persId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
//public Account getAccount() {
// return account;
//}
//public void setAccount(Account account) {
// this.account = account;
//}
@Override
public String toString() {
return "Person [persId=" + persId + ", firstName=" + firstName + ", surname=" + surname + ", emailAddress=" + emailAddress + "]";
}
}
现在,我要做的是做一个条件查询,它会给我一个电话号码与给定字符串相同的人。
我已经编写了一个测试,添加了一些示例数据并将其取回,但我真的不明白join在这里是如何工作的
CriteriaQuery<Person> query = personService.criteriaBuilder().createQuery(Person.class);
Root<Person> pRoot = query.from(Person.class);
Join<Person, PhoneNumber> pNumbers = pRoot.join(Person_.phoneNumbers);
这条线对吗?如果是这样的话,它会做什么?我以后如何在where子句中添加这些字段?提前谢谢大家
另外,整个项目包含更多文件-personService是一个界面,您可以假设它的所有用途都是正确的-这是我唯一有问题的标准查询不清楚您在这个示例中遇到了什么困难。这是一个内部联接-当您不使用重载版本的联接方法时,默认的JoinType.inner。如果子实体中对应的子行PhoneNumber重复,则查询将返回重复的父行Person。您需要使用DISTINCT从结果列表中筛选出可能重复的行,或者使用子查询。缺少WHERE子句,这是必需的,因为您需要有条件地获取结果列表。请完成查询。您正在使用JPA条件。标签[hibernate criteria]是另一回事。如果您没有处理Hibernate标准,请考虑删除它。
CriteriaQuery<Person> query = personService.criteriaBuilder().createQuery(Person.class);
Root<Person> pRoot = query.from(Person.class);
Join<Person, PhoneNumber> pNumbers = pRoot.join(Person_.phoneNumbers);