在此JPA 原生查询示例 中,我们将学习使用JPA 原生查询(SQL SELECT 查询)使用< createNativeQuery()
接口的 code>$$$ 方法。我们将传入要在底层数据库中执行的查询字符串和将作为结果返回的实体类型。在此示例中,我们还将使用命名的 sql 本机查询。
本机查询与命名查询
1. Native query是指实际的sql查询(指实际的数据库对象)。这些查询是可以使用数据库客户端直接在数据库中执行的sql语句。
2。 命名查询 是您通过给查询命名来定义查询的方式。您可以在 hibernate 的映射文件中定义它,也可以在实体级别使用注释。
命名 SQL 查询是使用 @NamedNativeQuery
注释定义的。此注释可以放置在任何实体上并定义查询的名称以及查询文本。与 JPQL 命名查询一样,查询的名称在持久性单元中必须是唯一的。
命名 SQL 本机查询定义如下:
@Entity(name="EmployeeEntity") @Table (name="employee") @NamedNativeQueries({ @NamedNativeQuery( name = "getAllEmployees", query = "SELECT id, firstName, lastName, email, department.id, department.name " + "FROM employee, department", resultClass=EmployeeEntity.class ), @NamedNativeQuery( name = "getAllEmployeesByDeptId", query = "SELECT id, firstName, lastName, email, department.id, department.name " + "FROM employee, department " + "WHERE department.id = ?", resultClass=EmployeeEntity.class ) }) public class EmployeeEntity implements Serializable { //more code }
这里我们定义了两个命名查询 getAllEmployees
和 getAllEmployeesByDeptId
。第一个查询返回所有员工数据,第二个查询将返回所有员工的部门 ID。
要执行上述 SQL 查询,您需要在 DAOImpl 类中编写以下代码。
@Override public List<EmployeeEntity> getAllEmployees() { List<EmployeeEntity> employees = manager.createNamedQuery("getAllEmployees", EmployeeEntity.class) .getResultList(); return employees; } @Override public List<EmployeeEntity> getAllEmployeesByDeptId(Integer id) { List<EmployeeEntity> employees = manager.createNamedQuery("getAllEmployeesByDeptId", EmployeeEntity.class) .setParameter(1, id) .getResultList(); return employees; }
因此,确保完全构建实体所需的所有必要数据是查询的一部分非常重要。如果您从查询中遗漏了一个字段,或者将其默认为某个值,然后修改生成的实体,则您可能会覆盖已存储在数据库中的正确版本。
从 SQL 查询中获取托管实体有两个好处。
例如,在许多数据库架构中,有一个暂存区用于保存尚未验证或需要某种转换才能移动到最终位置的数据。
使用 JPA,开发人员可以启动事务、查询暂存数据以构建实体、执行任何所需的更改,然后提交。新创建的实体将写入实体映射的表,而不是 SQL 查询中使用的登台表。
package com.cundage.jpa.demo.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.NamedNativeQueries; import javax.persistence.NamedNativeQuery; import javax.persistence.Table; @Entity(name="EmployeeEntity") @Table (name="employee") @NamedNativeQueries({ @NamedNativeQuery( name = "getAllEmployees", query = "SELECT id, firstName, lastName, email, department.id, department.name " + "FROM employee, department", resultClass=EmployeeEntity.class ), @NamedNativeQuery( name = "getAllEmployeesByDeptId", query = "SELECT id, firstName, lastName, email, department.id, department.name " + "FROM employee, department " + "WHERE department.id = ?", resultClass=EmployeeEntity.class ) }) public class EmployeeEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Integer id; private String firstName; private String lastName; private String email; @ManyToOne private DepartmentEntity department; public EmployeeEntity() {} public EmployeeEntity(String name, DepartmentEntity department) { this.firstName = name; this.department = department; } public EmployeeEntity(String name) { this.firstName = name; } //Setters and Getters @Override public String toString() { return "EmployeeVO [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", department=" + department + "]"; } }
package com.cundage.jpa.demo.entity; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity(name="DepartmentEntity") @Table (name="department") public class DepartmentEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Integer id; private String name; public DepartmentEntity(){ } public DepartmentEntity(String name) { super(); this.name = name; } @OneToMany(mappedBy="department",cascade=CascadeType.PERSIST) private List<EmployeeEntity> employees = new ArrayList<EmployeeEntity>(); //Setters and Getters @Override public String toString() { return "DepartmentVO [id=" + id + ", name=" + name + "]"; } }
public interface DepartmentDAO { public boolean addDepartment(DepartmentEntity dept); }
package com.cundage.jpa.demo.dao; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.cundage.jpa.demo.entity.DepartmentEntity; @Repository @Transactional public class DepartmentDAOImpl implements DepartmentDAO { @PersistenceContext private EntityManager manager; @Override public boolean addDepartment(DepartmentEntity dept) { try { manager.persist(dept); } catch (Exception e) { e.printStackTrace(); return false; } return true; } }
public interface EmployeeDAO { public List<EmployeeEntity> getAllEmployees(); public List<EmployeeEntity> getAllEmployeesByDeptId(Integer id); public boolean addEmployee(EmployeeEntity employee); }
package com.cundage.jpa.demo.dao; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.cundage.jpa.demo.entity.EmployeeEntity; @Repository @Transactional public class EmployeeDAOImpl implements EmployeeDAO { @PersistenceContext private EntityManager manager; @Override public List<EmployeeEntity> getAllEmployees() { List<EmployeeEntity> employees = manager.createNamedQuery("getAllEmployees", EmployeeEntity.class) .getResultList(); return employees; } @Override public List<EmployeeEntity> getAllEmployeesByDeptId(Integer id) { List<EmployeeEntity> employees = manager.createNamedQuery("getAllEmployeesByDeptId", EmployeeEntity.class) .setParameter(1, id) .getResultList(); return employees; } @Override public boolean addEmployee(EmployeeEntity employee) { try{ manager.persist(employee); }catch(Exception e){ e.printStackTrace(); return false; } return true; } }
package com.jpa.demo.test; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import com.cundage.jpa.demo.dao.DepartmentDAO; import com.cundage.jpa.demo.dao.EmployeeDAO; import com.cundage.jpa.demo.entity.DepartmentEntity; import com.cundage.jpa.demo.entity.EmployeeEntity; @ContextConfiguration(locations = "classpath:application-context-test.xml") @RunWith(SpringJUnit4ClassRunner.class) public class TestEmployeeDAO { @Autowired private EmployeeDAO employeeDAO; @Autowired private DepartmentDAO departmentDAO; @Test @Transactional @Rollback(true) public void testGetAllEmployees() { //Setup some test data in IM (in-memory) database setupData(); List<EmployeeEntity> employees = employeeDAO.getAllEmployees(); //Validate that data is found Assert.assertEquals(employees.size(), 1); EmployeeEntity employeeEntity = employees.get(0); //Now check if we got correct data Assert.assertEquals(employeeEntity.getFirstName(),"Lokesh"); Assert.assertEquals(employeeEntity.getLastName(),"Gupta"); Assert.assertEquals(employeeEntity.getDepartment().getName(),"Human Resource"); } @Test @Transactional @Rollback(true) public void testGetAllEmployeesByDeptId() { //Setup some test data in IM (in-memory) database setupData(); List<EmployeeEntity> employees = employeeDAO.getAllEmployeesByDeptId(1); //Validate that data is found Assert.assertEquals(employees.size(), 1); EmployeeEntity employeeEntity = employees.get(0); //Now check if we got correct data Assert.assertEquals(employeeEntity.getFirstName(),"Lokesh"); Assert.assertEquals(employeeEntity.getLastName(),"Gupta"); Assert.assertEquals(employeeEntity.getDepartment().getName(),"Human Resource"); } public void setupData() { DepartmentEntity department = new DepartmentEntity("Human Resource"); departmentDAO.addDepartment(department); EmployeeEntity employee = new EmployeeEntity(); employee.setFirstName("Lokesh"); employee.setLastName("Gupta"); employee.setEmail("cundage@gmail.com"); employee.setDepartment(department); employeeDAO.addEmployee(employee); } }
程序输出。
Hibernate: drop table department if exists Hibernate: drop table employee if exists Hibernate: create table department (id integer generated by default as identity (start with 1), name varchar(255), primary key (id)) Hibernate: create table employee (id integer generated by default as identity (start with 1), email varchar(255), firstName varchar(255), lastName varchar(255), department_id integer, primary key (id)) Hibernate: alter table employee add constraint FK4722E6AE5591DEEE foreign key (department_id) references department HHH000230: Schema export complete Hibernate: insert into department (id, name) values (default, ?) binding parameter [1] as [VARCHAR] - Human Resource Hibernate: insert into employee (id, department_id, email, firstName, lastName) values (default, ?, ?, ?, ?) binding parameter [1] as [INTEGER] - 1 binding parameter [2] as [VARCHAR] - cundage@gmail.com binding parameter [3] as [VARCHAR] - Lokesh binding parameter [4] as [VARCHAR] - Gupta Hibernate: SELECT id, firstName, lastName, email, department.id, department.name FROM employee, department WHERE department.id = ? binding parameter [1] as [INTEGER] - 1 Found [1] as column [id] Hibernate: insert into department (id, name) values (default, ?) binding parameter [1] as [VARCHAR] - Human Resource Hibernate: insert into employee (id, department_id, email, firstName, lastName) values (default, ?, ?, ?, ?) binding parameter [1] as [INTEGER] - 2 binding parameter [2] as [VARCHAR] - cundage@gmail.com binding parameter [3] as [VARCHAR] - Lokesh binding parameter [4] as [VARCHAR] - Gupta Hibernate: SELECT id, firstName, lastName, email, department.id, department.name FROM employee, department Found [2] as column [id]
把你的问题和意见告诉我。
快乐学习!!
参考:
标签2: JPA地址:https://www.cundage.com/article/jpa-native-query-example-select.html