我是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
答案 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
获取值。