博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Spring Data Jpa的分页、跨表查询
阅读量:2353 次
发布时间:2019-05-10

本文共 1556 字,大约阅读时间需要 5 分钟。

分页

jqa的query使用原生sql查询(nativeQuery = true)的时候不支持排序的,需要在sql里面加上:ORDER BY ?#{#pageable}

Example

@Query(value = "select u.* from user u INNER JOIN project_user pu " +        "ON pu.project_id=?1 AND pu.user_id=u.user_id ORDER BY ?#{#pageable}",        countQuery = "select count(*) from user u INNER JOIN project_user pu " +                "ON pu.project_id=?1 AND pu.user_id=u.user_id",        nativeQuery = true)Page
findByProjectId(String projectId, Pageable pageable);

注意:

countQuery中不要写成:

“select count(u.*) from user u INNER JOIN project_user pu ON pu.project_id=?1 AND pu.user_id=u.user_id”

count(u.*)会报错,应该写为count(*)

About other

ORDER BY ?#{#pageable}用于 Pageable. countQuery 用于Page<>。

如果不写countQuery,那么jpa会默认在select的参数上加count,例如上面例子就会成为 select (u.*) …

这样就会报错。所以应该写出自定义的countQuery


跨表查询

难点

JpaRepository中的接口方法返回类型只能是实体类或者Object[](值作为字符串列表返回,没有key),如果这时想要通过跨表连接查询,返回一个非实体类的DTO,就会报错。

Solution

利用HQL可以轻松解决。例如:

@Query( value = "select new com.test.dto.GetProjectUserDto(u.userId, u.name, u.displayName, r.name, pu.description) from User u, ProjectUser pu, Role r " +         "where pu.projectId=?1 AND pu.userId=u.userId AND pu.roleId=r.id", countQuery = "select count(*) from User u, ProjectUser pu, Role r " +         "where pu.projectId=?1 AND pu.userId=u.userId AND pu.roleId=r.id")    Page
findByProjectId(String projectId, Pageable pageable);

注意:

  • @Query内写的是HQL;SQL中的inner joinon在这里改为,where
  • HQL内的写的是实体类的类名、字段名(不是数据库中的表名、字段名)
  • DTO必须有对应的constructor,否则会报错找不到。推荐用lombok的注解@AllArgsConstructor,简单高效。
  • 不必再像上面在HQL中加入ORDER BY ?#{#pageable}

转载地址:http://yiztb.baihongyu.com/

你可能感兴趣的文章
简单字符设备驱动程序的操作步骤
查看>>
视频压缩:I帧、P帧、B帧
查看>>
视频编解码基础一
查看>>
视频编码学习二
查看>>
视频处理
查看>>
Python的安装教程
查看>>
谈谈码率、帧率、分辨率和清晰度
查看>>
OSI参考模型通信举例
查看>>
Vue.js 入门学习(一)
查看>>
Vue.js入门学习(二)实例、数据绑定、计算属性
查看>>
Vue.js入门学习(三) Class与Style绑定
查看>>
Vue.js入门学习(五)方法与事件处理器、表单控件绑定
查看>>
项目:Vue.js高仿饿了吗外卖APP(一)
查看>>
javascript中一些相对位置
查看>>
vue高仿饿了么课程项目--布局篇学习笔记
查看>>
es6 javascript的Iterator 和 for...of 循环
查看>>
Javascript中的shift() 、unshift() 和 pop()、push()区别
查看>>
将嵌套的数组扁平化
查看>>
vue-router的两种模式及区别
查看>>
c中嵌入python
查看>>