如何使用JPA / JPQL查询和外键从数据库中读取数据

时间:2017-01-31 13:07:41

标签: java jpa jpql

我是JPA的新手,我遇到了问题。假设我们有两个由ManytoOne关联相关的表。 表1:person(idp,name,#idep) 表2:离开(idep,deptname)

我想在sql:

中编写一个像jpa查询这样的查询
sysctlbyname("hw.cpufamily", &type, &size, nil, 0);

Person.java

select person.name,departement.deptname from person,departement where person.idep=department.idep

Departement.java

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer idp;
private String name;

//Jointures JPA
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_dep")
private Departement dept;

//Getters/Setters

我试过了这个尝试,但它不起作用:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id_dep;
private String deptname;

@OneToMany(mappedBy="departement", cascade = { CascadeType.ALL })
private List<Person> listperson=new ArrayList<Person>();

//getters/setters

3 个答案:

答案 0 :(得分:1)

查询非常简单,因为这两个实体相互关联:

String queryString = "select p.name,d.deptname from Person p JOIN p.dep d";
List list = entityManager.createQuery(queryString).getResultList();

// use the result list as follows, for example:
for (Object[] o : list) {
    System.out.println("Person name: " + o[0]);
    System.out.println("Department name: " + o[1]);
}

提示: Java有命名约定。其中一个是实例字段的名称。所以建议不是

private Integer id_dep

private Integer id; // for examle 

实际上,按惯例,实体的id字段只是id。如果您有兴趣,可以阅读Java coding conventions

答案 1 :(得分:0)

与使用JPA一样,这种查询应该通过简单地调用返回Person of List的方法 getListPerson()来自动进行。当您调用get方法时,提供程序可能是您使用( Hibernate )应该使用JPA注释来创建SQL并为您执行它。

entityManager.createQuery(&#34;&#34;)通常在您需要hibernate无法执行的特定查询时使用,例如,当您需要仅返回特定字段时一个实体,例如人。

答案 2 :(得分:0)

要使其工作,您应该查询字段,因此p.name不正确。您还调用了a,而Person的别名设置为entityManager.createQuery("select a.name, d.deptname " + " from Person a, Department d " + "where a.dept.id_dep = d.id_dep ").getResultList(); 。查询应如下所示:

join

如果它不起作用{}可能需要{。}}。

entityManager.createQuery("select p.name, d.deptname " + " from Department d JOIN Department.listperson p "
 + "where d.id_dep = p.dept.id_dep ").getResultList();

尽管使用JPA可能不是理想的解决方案,因为您可以更轻松地从listperson获取值。