JPA使用SQL的一些总结
一. 概述
简单的增删改查使用 JPA 非常方便,复杂的 Where 条件我们也在 Specification 和 CriteriaBuilder 的基础上封装了 WhereBuilder,实现了类似 C# 的 LINQ 的写法,但是在很多情况下是需要使用 SQL 的,而且很多情况下原生 SQL 效率高很多。
JPA 支持二种最基本的 SQL 方式,Native SQL 和 JPQL,JPQL 语法非常类似于SQL语法,但是是针对 Java 对象和实体。我更倾向原生 SQL,毕竟 SQL 是通用的标准,开发人员或多或少都是掌握 SQL 的。
以下是在 JPA 里使用 SQL 的一些总结,不同的情况下有不同的应对方式。
二. @Query注解的方式
我们可以直接在 DAO 的接口里定义 SQL,以下列出了7种方式:
@Repository public interface UserDao extends JpaRepository<UserEntity, String>, JpaSpecificationExecutor<UserEntity> {
@Query(nativeQuery = true, value = "select * from d1_user where name like %?1%") Optional<UserEntity> test1(String name); @Query(nativeQuery = true, value = "select * from d1_user where name like %?1%") Optional<UserVm> test2(String name); @Query(nativeQuery = true, value = "select * from d1_user where name like %?1%") Optional<IUserVm> test3(String name); @Query("select new d1.dxdevices.iot.user.model.UserVm( u.name,u.id,u.remark) from UserEntity u where u.name like %?1%") Optional<UserVm> test4(String name); @Query(nativeQuery = true, value = "select * from d1_user where name like %?1%") Optional<Object> test5(String name); @Query(nativeQuery = true, value = "select * from d1_user where callback_url is null") Page<UserEntity> test6(Pageable pageable); @Query(nativeQuery = true, value = "select * from d1_user where callback_url is null", countQuery = "select count(*) from d1_user where callback_url is null") Page<UserEntity> test7(Pageable pageable); }
郭慕荣博客园

浙公网安备 33010602011771号