spring-boot-data-jpa nativeQuery 详解

问题:

1:一般情况下,用spring-boot data jpa查询sql稍有点多,本来一条sql解决的事情,一定要几条, 如何优化成一条sql解决,还能带上分页

2:这个时候@Query注解里面的nativeQuery就可以派上用场 (用left join fetch也可以优化成一条sql,见http://www.blogjava.net/liuguly/archive/2017/11/13/432890.html)

3:nativeQuery的用途是可以使用原生sql。

经过实践,官网给出的示例无法跑通:

spring-boot-data-jpa nativeQuery 详解

解决方法

1: 先按照上述官网示例进行配置

2: 示例:

@Repository

public interface BabySittingDao  extends PagingAndSortingRepository<BabySitting, Long> {

/**

* 获取喜欢的sharecare列表


@param

accountId 当前用户id


@param

fType 喜欢的类型  0-> sharecare  1-> babysitting  2->event


@param

pageable 分页


@return

分页结果


*/

@Query(value = "SELECT s.* FROM sharecare.sb_baby_sitting s WHERE s.id IN (" +

"SELECT f.f_type_id FROM sharecare.sb_favorite f WHERE f.f_type=?2 AND f.owner_id=?1)   ORDER BY ?#{#pageable} ",

countQuery = "SELECT COUNT (*) FROM  (SELECT s.* FROM sharecare.sb_baby_sitting s WHERE s.id IN " +

"(SELECT f.f_type_id FROM sharecare.sb_favorite f WHERE f.f_type=?2 AND f.owner_id=?1))",

nativeQuery =  true )

Page<BabySitting> findFavoriteBabySitting(Long accountId, Integer fType, Pageable pageable);

说明:@Query里面的value是原生sql 、countQuery表示查询总数、nativeQuery表示这是一条原生sql

注意点:

1: 这个接口方法

findFavoriteBabySitting一定要放在当前领域模型的Dao接口里面,不能放在其它Dao接口中,否则就是网上流传的类型转换错误!

2: 见红色标注,一定要这样写,不能ORDER BY ?3这样写,也不能ORDER BY #{#pageable}这样写,否则就是网上流传的各种错!

3: 一定要加nativeQuery=true

经过以上配置,就可正确查询出结果且自带分页!

完!

原文 

http://www.blogjava.net/liuguly/archive/2017/11/14/432891.html

PS:如果您想和业内技术大牛交流的话,请加qq群(527933790)或者关注微信公众 号(AskHarries),谢谢!

转载请注明原文出处:Harries Blog™ » spring-boot-data-jpa nativeQuery 详解

赞 (0)

分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址