JPA教程 – JPA查询检索多对一映射示例 以下查询从多对一映射检索实体。 List l = em.createQuery("SELECT d.employees FROM Department d") .getResultList(); 例子 下面的代码来自PersonDaoImpl.java。 package cn.w3cschool.common; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; @Transactional public class PersonDaoImpl { public void test() { prepareData(); List l = em.createQuery("SELECT d.employees FROM Department d") .getResultList(); for (Object p : l) { printResult(p); } } private void prepareData() { Professor p = new Professor(); p.setId(0); p.setName("TOM"); Department d = new Department(); d.setId(1); d.setName("Design"); p.setDepartment(d); d.getProfessors().add(p); em.persist(p); em.persist(d); } private static void printResult(Object result) { if (result == null) { System.out.print("NULL"); } else if (result instanceof Object[]) { Object[] row = (Object[]) result; System.out.print("["); for (int i = 0; i < row.length; i++) { printResult(row[i]); } System.out.print("]"); } else if (result instanceof Long...
JPA教程 – JPA查询多个命名查询示例 以下代码创建几个命名查询。 @Entity @NamedQueries({ @NamedQuery(name="Professor.findAll", query="SELECT e FROM Professor e"), @NamedQuery(name="Professor.findByPrimaryKey", query="SELECT e FROM Professor e WHERE e.id = :id"), @NamedQuery(name="Professor.findByName", query="SELECT e FROM Professor e WHERE e.name = :name") }) public class Professor { @Id private int id; 例子 以下代码来自Professor.java。 package cn.w3cschool.common; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @NamedQueries({ @NamedQuery(name="Professor.findAll", query="SELECT e FROM Professor e"), @NamedQuery(name="Professor.findByPrimaryKey", query="SELECT e FROM Professor e WHERE e.id = :id"), @NamedQuery(name="Professor.findByName", query="SELECT e FROM Professor e WHERE e.name = :name") }) public class Professor { @Id private int id; private String name; private long salary; @Temporal(TemporalType.DATE) private Date startDate; @OneToOne private...
JPA教程 – JPA查询命名示例 命名查询是用于组织查询定义和提高应用程序性能的强大工具。 命名查询是使用@NamedQuery注释定义的,它可以放在任何实体的类定义上。 注释定义查询的名称以及查询文本。 以下代码显示如何使用注释创建命名查询。 @NamedQuery(name="findSalaryForNameAndDepartment", query="SELECT e.salary " + "FROM Employee e " + "WHERE e.department.name = :deptName AND " + " e.name = :empName") 命名查询通常放置在最直接对应于查询结果的实体类上,因此Employee实体将是此命名查询的良好位置。 查询的名称的范围限定为整个持久性单元,并且在该范围内必须是唯一的。 通常的做法是在查询名称前加上实体名称。 例如,Employee实体的“findAll”查询将命名为“Employee.findAll”。 以下代码显示为实体创建多个命名查询 @NamedQueries({ @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e"), @NamedQuery(name="Employee.findByPrimaryKey", query="SELECT e FROM Employee e WHERE e.id = :id"), @NamedQuery(name="Employee.findByName", query="SELECT e FROM Employee e WHERE e.name = :name") }) 例子 以下代码创建单个命名查询。 @Entity @NamedQuery(name="findSalary", query="SELECT e.salary " + "FROM Professor e ") public class Professor { 以下代码来自Phone.java。 package cn.w3cschool.common; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Phone { @Id private long id; private String number; private String type; @ManyToOne Professor employee; public long getId() { return id; } public void setId(long id) { this.id = id; }...