Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA标准查询,如何加入实体-Hibernate-_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java JPA标准查询,如何加入实体-Hibernate-

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 =

我用hibernate做了一个JPA项目。它比这个复杂一点,但这里有两个类:

@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);