问题:
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。
经过实践,官网给出的示例无法跑通:
解决方法:
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
经过以上配置,就可正确查询出结果且自带分页!
完!
关于领域模型的补充说明:
1:不管实体类的属性如何命名哪怕是abcdef,只要配置好映射即:@Column注解对应的表字段。
2:那么以上所述的查询方式,仍然能正确返回结果,正确映射成Page<领域模型>。
posted on 2017-11-14 14:20
朔望魔刃 阅读(5606)
评论(0) 编辑 收藏 所属分类:
java