前言
spring data jpa 提供了良好的数据库操作接口,通过继承JpaRepository接口,可以很方便的提供对数据的操作。但在有些时候我们可能需要一些动态的查询条件,通过上面的方式就有些不方便了。下面提供了一种自定义sql的方式。
一、创建EntityManager实体对象
示例代码如下:
@Bean(name = "entityManager")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) { // EntityManagerFactoryBuilder有jpa自动配置,并注入ioc中
return Objects.requireNonNull(entityManagerFactory(builder).getObject()).createEntityManager();
}
@Bean(name = "entityManagerFactory") //创建实体工厂
public LocalContainerEntityManagerFactoryBean entityManagerFactory (EntityManagerFactoryBuilder builder) {
return builder.dataSource(secondDataSource)
.properties(getHibernateProperties())
.packages("com.xxx.basic.entity") //换成你自己的实体类所在位置
.persistenceUnit("persistenceUnit")
.build();
}
二、引入EntityManager对象
EntityManager是javax.persistence包下的一个接口。从字面上解释是实体类的管理者,从注释上来看是:EntityManager对象与一个持久化的容器相关联,一个持久化容器由一组唯一的实体对象组成,持久化容器管理实体对象的生命周期,EntityManager Api 可以用来创建和删除实体对象,通过主键查找实体或者查询实体。
<p> An <code>EntityManager</code> instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity instance. Within the persistence context, the entity instances and their lifecycle are managed. The <code>EntityManager</code> API is used to create and remove persistent entity instances, to find entities by their primary key, and to query over entities.
在ioc容器中通过@PersistenceContext或者@Autowired引入EntityManager对象,示例代码如下:
public class TestServiceImpl implements TestService {
@PersistenceContext(name = "xxx") //name 对应于 spring data jpa中配置的EntityManager对象名
private EntityManager entityManager;
}
三、使用EntityManager进行查询
示例代码如下:
public List<UserInfo> queryUserInfoByUserNo(String userNo) {
StringBuilder sqlBuilder = new StringBuilder(" SELECT * FROM t_user WHERE user_no= :userNo ");
//拼接条件
//....
Query nativeQuery = entityManager.createNativeQuery(sqlBuilder.toString(), UserInfo.class);
nativeQuery.setParameter("userNo",userNo);
return nativeQuery.getResultList();
}
总结
这篇文章主要介绍了spring data jpa 环境下,如何执行自定义sql,具体实现方式还有多种方式,欢迎各位大佬在评论区留言。