如何多表关联查询springdatajpa,springdatajpa多表关联查询
00-1010如何使用union多表分页条件查询分页条件踩过的坑分享几个用来解决原生sqlunionbug的mysql语法jpa。
00-1010当前项目有全局搜索功能,需要涉及7-8个主表。由于当前项目使用Jpa,我决定使用union通过原生sql进行查询。因为不熟悉这个框架,被坑了很久。特此记录。
00-1010 1.在参数列表中,使用@Param批注(例如:@ param ("userid") long userid)
2.参数应该以sql中:userId的形式注入(例如:person.user_id=:userId),或者用?1 ?2也可以按照参数的顺序注入。我用了第一个。
3.sql应该用@Query的值写,设置nativeQuery=true
4.如果要设置一个可能为空的值,比如有一个分类,需要作为条件查询,但是这个值可能为空,所以需要在sql中判断。如果为空,则不会被过滤。其实语法和sql中的判断是一样的。
其中IF(:category不为空,a.category=:category不为空,1=1)
00-1010 1.参数countQuery必须添加到分页中,上面的sql价格是可以计数的。
2.传入Pageable,不要传入sort,否则会报错。暂时没有找到解决办法。
例如,select * from a is your sql
那么分页应该是
select * from(select * from a)b order by?countQuery中不需要添加#{#pageable}order by。
3.返回PageObject[],封装内容的顺序就是sql查找的顺序。
00-1010 1.对于多表联合查询,查询字段应该相同。例如,第一个用户表必须查询id、姓名、性别,第二个地址表也必须查询id、姓名、性别。如果没有这样的字段,它将自我封装并返回一个固定值,该值可以是空字符串。
2.当它被引入pageable时。#{#pageable}必须这样写
00-1010 1.判断是否为空,如果不为空,则查询时间在传入时间之间的数据。
如果(3360开始时间不为空,结束时间不为空,则继续。Create _ time介于3360开始时间和3360结束时间之间,1=1)这里我判断了服务中结束时间是否为空。如果结束时间为空,开始时间不为空,我会默认查询一年的数据。
2.根据名称进行模糊查询。
继续。像concat (% , content, %) 3这样的内容。最后根据查出来的总数据筛选类型。
IF(:category不为空,a.category=:category不为空,1=1)小结一下:
1.其实就是一个简单的分页条件查询。因为不熟悉jpa语法,浪费了很多时间。希望能帮助到更多的人。
2.暂时不知道怎么排序。无论是传入pageable中的排序,还是在sql的末尾进行排序,都会得到一个错误。如果有大老板知道,可以点一下。
目录
@ Query(value= SELECT * FROM count _ entity where id=-1111 union(SELECT * FROM count _ entity where video _ name=?1、platform=腾讯视频 ORDER BY click_date DESC限制?2) UNION (SELECT * FROM count _ entity其中video_name=?1和platform=爱奇艺 ORDER BY click_date DESC限制?2) UNION (SELECT * FROM count _ entity其中video_name=?1和platform=芒果TV ORDER BY click_date DESC限制?2),nativeQuery=true)空数据查询需要连接在union前面,因为Union的第一个查询不能使用()
以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。