java jpa自定义sql语句

背景:最近接手的项目是spring boot + jpa,有点懵,突然回忆到刚工作实习的时候学习过这个搭配的,如今是忘得一干二净啊。

2019-02-25 我曾经写过这么一篇博客:jpa通过解析方法名创建查询和使用@Query创建自定义查询,回头一看已经两年有余。

        本篇只是为了再次记录自己又学习了jpa的使用,框架原生的通过解析方法名多适用于单表操作,自定义的sql查询则可以解决所有问题,记录些自定义sql语法的记录,以便后续参照。

1.多表关联查询,含条件。

 @Query(value = "SELECT b FROM QyVideo a JOIN YjQyXx b ON  a.qyId = b.id AND a.cameraId = ?1 ")

2.清空表

@Transactional
@Modifying
@Query(value = "truncate table yj_qy_xx", nativeQuery = true)

注:update、truncate或delete时必须使用@Modifying和@Transactional对方法进行注解,才能使得ORM知道现在要执行的是写操作。

3.模糊查询

 @Query("select p from WhpzxryzsXxPo p where p.ryxm like concat('%',?1,'%') and p.cyyxqq >= ?2")

4.查询结果为VO,含两个实体类

@Query(value = "SELECT new com.kun.aqsczt.vo.FxjzfbVo(u, seventinfo) FROM SSmsInfo u left join SEventInfo seventinfo on u.referId = seventinfo.eventId WHERE (:referType IS NULL OR :referType IS '' OR u.referType = :referType) AND (:isSend IS NULL OR :isSend IS '' OR u.isSend = :isSend) ")

5.使用@Param注解注入参数,分页查询 

@Query(value = "SELECT a  FROM CEiWorkaccMaybe a " +
            "WHERE (:psnName IS NULL OR :psnName IS '' OR a.psnName LIKE %:psnName%) " +
            "AND (:commName IS NULL OR :commName IS '' OR a.commName LIKE %:commName%) " +
            "AND (:idCard IS NULL OR :idCard IS '' OR a.idCard LIKE %:idCard%) " +
            "AND (:doctorDateStart IS NULL OR :doctorDateStart IS '' OR a.doctorDate >= :doctorDateStart) " +
            "AND (:doctorDateEnd IS NULL OR :doctorDateEnd IS '' OR a.doctorDate <= :doctorDateEnd) "
    )
Page<CEiWorkaccMaybe> getSuspectedWorkAccidentVerification(
            @Param("psnName") String psnName,
            @Param("commName") String commName,
            @Param("idCard") String idCard,
            @Param("doctorDateStart") String doctorDateStart,
            @Param("doctorDateEnd") String doctorDateEnd,
            Pageable pageable
    );

        无非是把日常的sql中的表名换成了对应的实体类名,接收参数适用 ?加上第几个参数的几。当然也可使用@Param注解注入参数,就变成了使用 :参数 名称接收。

### JPA 中实现自定义查询语句的两种方法 在 Java Persistence API (JPA) 中,可以通过多种方式实现自定义查询语句。以下是其中两种常见的实现方式: #### 方法一:使用方法命名规则进行查询 通过遵循特定的方法命名规则,可以在 Repository 接口中直接定义查询逻辑而无需显式编写查询语句。这种方法简单直观,适用于基本的条件查询场景。 - **规则说明** 查询方法通常以 `find`, `read` 或 `get` 开头,并结合实体类中的属性名称以及相应的条件关键字来构成完整的查询逻辑[^2]。例如: - 条件查询:`findBy<Property><Condition>(...)` - 模糊匹配:`findBy<Property>Like(...)` - **示例代码** ```java public interface UserRepository extends JpaRepository<User, Long> { List<User> findByUsername(String username); List<User> findByUsernameAndEmail(String username, String email); List<User> findByUsernameLike(String usernamePattern); } ``` 此方法的优点在于开发效率高且易于维护,但对于复杂查询可能显得不够灵活。 --- #### 方法二:使用 `@Query` 注解定义 JPQL 或原生 SQL 查询 对于更加复杂的查询需求,可以利用 `@Query` 注解在 Repository 接口方法上指定具体的 JPQL(Java Persistence Query Language)或原生 SQL 查询语句。 - **JPQL 示例** ```java public interface UserRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.username = ?1 AND u.email = ?2") List<User> findCustomUsers(String username, String email); } ``` - **原生 SQL 示例** 如果需要执行数据库特有的功能,则可以选择使用原生 SQL 查询。此时需设置 `nativeQuery=true` 属性。 ```java public interface UserRepository extends JpaRepository<User, Long> { @Query(value = "SELECT * FROM users WHERE username = ?1 AND email = ?2", nativeQuery = true) List<Object[]> findNativeUsers(String username, String email); } ``` 这种方式提供了极大的灵活性,允许开发者精确控制查询逻辑,但也增加了语法错误的风险并降低了可移植性[^3]。 --- ### 总结 上述两种方法各有优劣。当面对简单的查询需求时,推荐采用基于方法命名规则的方式;而对于较为复杂的业务场景,则更适合运用 `@Query` 注解配合 JPQL 或者原生 SQL 实现定制化解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值