JPA 删除实体示例——@NamedNativeQuery 示例

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(317)   2023-06-26 07:54:18

JPA delete entity example中,我们将学习delete JPA entities using @NamedNativeQuery created with createNativeQuery() EntityManager 接口的方法。这里我们传入要在底层数据库中执行的查询字符串和一个虚拟结果映射 [更多参考]。在此示例中,我们将使用命名 SQL 本机查询在一个地方定义删除查询。

1.创建命名本机DELETE查询

命名 SQL 查询是使用 @NamedNativeQuery 注释定义的。此注释可以放置在任何实体上并定义查询的名称以及查询文本。与 JPQL 命名查询一样,查询的名称在持久性单元中必须是唯一的。

SQL DELETE 语句的命名本机查询定义如下:

@Entity(name="EmployeeEntity")
@Table (name="employee")

@SqlResultSetMapping(name="deleteResult", columns = { @ColumnResult(name = "count")})

@NamedNativeQueries({
		@NamedNativeQuery(
				name	=	"deleteEmployeeById",
				query	=	"DELETE FROM employee WHERE id = ?"
				,resultSetMapping = "deleteResult"
		)
})

public class EmployeeEntity implements Serializable
{
	//more code
}

这里我们定义了一个命名的本地查询 deleteEmployeeById。它可用于使用员工 ID 从数据库中删除员工记录。这是一个jpa delete entity by id的例子。

2.如何执行命名删除查询

要执行上述 SQL 删除查询,我们需要使用 EntityManager.executeUpdate() 方法。

@PersistenceContext
private EntityManager manager;

@Override
public boolean deleteEmployeeById( Integer id ) 
{
	try
	{
		manager.createNamedQuery("deleteEmployeeById", EmployeeEntity.class)
		.setParameter(1, id)
		.executeUpdate();
		
		//Execute the delete query
		manager.flush();
		
		//update entity manager with changes
		manager.refresh(getEmployeeById(id));
		
		return true;
	}
	catch (Exception e)
	{
		return false;
	}
}

3. JPA删除实体示例-完整示例

3.1.员工实体.java

package com.cundage.jpa.demo.entity;

import java.io.Serializable;
import javax.persistence.ColumnResult;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
 
@Entity(name="EmployeeEntity")
@Table (name="employee")

@SqlResultSetMapping(name="deleteResult", columns = { @ColumnResult(name = "count")})

@NamedNativeQueries({
		@NamedNativeQuery(
				name	=	"deleteEmployeeById",
				query	=	"DELETE FROM employee WHERE id = ?"
				,resultSetMapping = "deleteResult"
		)
})

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;
     
    public EmployeeEntity() {}

    //Setters and Getters
    
    @Override
    public String toString() {
        return "EmployeeVO [id=" + id + ", firstName=" + firstName
                + ", lastName=" + lastName + ", email=" + email + "]";
    }
}

3.2. EmployeeDAO.java

public interface EmployeeDAO 
{
	public boolean deleteEmployeeById(Integer id);
	
	public EmployeeEntity getEmployeeById(Integer id);

	public boolean addEmployee(EmployeeEntity employee);
}

3.3. EmployeeDAOImpl.java

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.EmployeeEntity;

@Repository
@Transactional
public class EmployeeDAOImpl implements EmployeeDAO 
{

	@PersistenceContext
	private EntityManager manager;
	
	@Override
	public boolean deleteEmployeeById( Integer id ) 
	{
		try
		{
			manager.createNamedQuery("deleteEmployeeById", EmployeeEntity.class)
			.setParameter(1, id)
			.executeUpdate();
			
			//Execute the delete query
			manager.flush();
			
			//update entity manager with changes
			manager.refresh(getEmployeeById(id));
			
			return true;
		}
		catch (Exception e)
		{
			return false;
		}
	}

	@Override
	public boolean addEmployee(EmployeeEntity employee) {
		try 
		{
			manager.persist(employee);
		} 
		catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public EmployeeEntity getEmployeeById(Integer id) {
		EmployeeEntity employee = null;
		try 
		{
			employee = manager.find(EmployeeEntity.class, id);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		return employee;
	}
}

3.4. TestEmployeeDAO.java

package com.jpa.demo.test;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

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.EmployeeDAO;
import com.cundage.jpa.demo.entity.EmployeeEntity;

@ContextConfiguration(locations = "classpath:application-context-test.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestEmployeeDAO 
{
	
	@Autowired
	private EmployeeDAO employeeDAO;
	
	@PersistenceContext
	private EntityManager manager;
	
	/*@Autowired
	private DepartmentDAO departmentDAO;*/
	
	@Test
	@Transactional
	@Rollback(true)
	public void testUpdateEmployee()
	{
		//Setup some test data in IM (in-memory) database
		setupData();
		
		EmployeeEntity employee = employeeDAO.getEmployeeById(1);
				
		//Now check if we got correct data
		Assert.assertEquals(employee.getFirstName(),"Lokesh");
		Assert.assertEquals(employee.getLastName(),"Gupta");
		
		/***********Now delete this employee using native SQL DELETE query***********/
		
		employeeDAO.deleteEmployeeById(1);
		
		//Now verify if employee is deleted or not
		
		EmployeeEntity deletedEmployee = employeeDAO.getEmployeeById(1);
		Assert.assertNull(deletedEmployee);
	}
	
	public void setupData()
	{
		EmployeeEntity employee = new EmployeeEntity();
		employee.setFirstName("Lokesh");
		employee.setLastName("Gupta");
		employee.setEmail("cundage@gmail.com");
		
		employeeDAO.addEmployee(employee);
	}
}

上述测试用例的输出将是:

Hibernate: insert into employee (id, email, firstName, lastName) values (default, ?, ?, ?)
binding parameter [1] as [VARCHAR] - cundage@gmail.com
binding parameter [2] as [VARCHAR] - Lokesh
binding parameter [3] as [VARCHAR] - Gupta
Hibernate: DELETE FROM employee WHERE id = ?
binding parameter [1] as [INTEGER] - 1
Hibernate: select employeeen0_.id as id0_0_, employeeen0_.email as email0_0_, employeeen0_.firstName as firstName0_0_, employeeen0_.lastName as lastName0_0_ from employee employeeen0_ where employeeen0_.id=?
binding parameter [1] as [INTEGER] - 1
Hibernate: select employeeen0_.id as id0_0_, employeeen0_.email as email0_0_, employeeen0_.firstName as firstName0_0_, employeeen0_.lastName as lastName0_0_ from employee employeeen0_ where employeeen0_.id=?
binding parameter [1] as [INTEGER] - 1

使用上述方法为 jpa delete all 创建查询

把你的问题和意见告诉我。

快乐学习!!

标签2: JPA
地址:https://www.cundage.com/article/jpa-native-delete-sql-query-example.html

相关阅读

在 JPA 中,要删除一个实体,实体本身必须被管理,这意味着它存在于持久性上下文中。这意味着调用应用程序应该已经加载或访问了实体,现在正在发出删除它的命令。 这通常不是问题,因为应用程序通常会在...
JPA
在JPA delete entity example中,我们将学习delete JPA entities using @NamedNativeQuery created with createN...
JPA
在此JPA 原生查询示例 中,我们将学习使用JPA 原生查询(SQL SELECT 查询)使用< createNativeQuery() 接口的 code&gtl;$$$ 方法。我们将传入...
JPA
在此JPA executeUpdate 示例中,我们将学习使用jpa 存储库中的更新查询,该存储库是使用$$ 的createNativeQuery() 方法创建的$ 接口。在这里,我们传入要在基...
JPA
在 JPA 中,一旦一个实体被持久化在数据库中,通常要做的下一件事就是找到再次。让我们看看如何使用实体管理器找到实体。 使用 EntityManager.find() 实际上,只有一行是重要的:...
JPA
在这个例子中,我们将学习配置 Spring MVC 和 Hibernate with JPA 以及其他一些东西,例如验证和自定义属性编辑器。过去我被要求写这个教程的次数已经够多了,所以就在这里。...
在JPA中,实体的映射信息必须在运行时可供ORM提供者访问,以便在将数据写入存储时,可以从实体实例中获取映射信息。同样,当从存储中加载实体状态时,提供者运行时必须能够将数据映射到新的实体实例中。...
JPA
Spring Boot Data JPA 排序教程展示了如何在 Spring Data JPA 中对查询结果进行排序。查询结果使用 ORDER BY 子句或 Sort 对象进行排序。 春天 是一...
Spring Data JPA 允许您通过使用 Repository 接口快速开发数据访问层。有时您需要从 Spring Data JPA 访问 EntityManager。这篇文章向您展示了如...
我们已经在之前的教程中了解了 mapping associated entities in hibernate,例如 one-to-one mapping 和 < strong&gtl;一...