最近工作中频繁的使用 SPring Data JPA
,一开始对SPring Data JPA
不甚了解,就感觉在利用SPring Data JPA
进行复杂查询的时候感觉非常滞涩。事实证明,SPring Data JPA
虽然存在一些局限性,但是只要能够了解其提供的接口就可以用来完成非常复杂的功能。本文就从实用的角度,对SPring Data JPA
的一些较为冷门而又实用的用法进行总结。
利用JPQL
进行@OneToMany
的关联查询
首先,举一个一对多的例子,球队和球员,一个球队有多个球员,那么具体的映射代码如下:
|
|
现在假设要查询队员有年龄小于20的队伍有哪些,有两种方法。一种是在继承 JpaRepository
的接口中定义查询方法,但是当查询条件复杂的时候,查询的方法名就会非常的长,不利于阅读;于是就有了第二种方法,在自定义的查询方法上写JPQL
查询语句
以上是从One到Many的查询,那么如何从Many到One进行关联查询呢?
例如查出某个球队下的所有球员,可以使用如下的查询语句:
|
|
以上的三条查询实际上会生成两条查询SQL
,如果只想生成一条查询SQL,则需要使用fetch join
,如下:
@Query()中的Top k查找
为了能够处理更复杂的条件查询,常常使用@Query
注解,自己写JPQL
语句,但是这个时候在自定义方法查询中的Top
关键字就不能使用了,在这种情况下如果还想要查询Top k
记录就需要利用Pageable
的分页功能。如下所示
|
|
在Pageable
中还可以对排序结果进行排序和分页,使用如下注解
@PageDefault(size= 10 , sort = "attributeTobeSort" , direction = Sort.Directin.DESC)
其中: size
表示每一页的数据条数
sort
表示按照哪一个字段进行排序
direction
表示排序是按照升序还是降序进行排列
注解@PageDefault
主要在Controller
中进行使用,所以要想使用Pageable
的功能,就需要为其传递如下的几个参数
##Spring Data Jpa 查询返回自定义对象
查询方法如下
此时返回的结果是List<Object[]>
,如果想要返回自定义的UserVo
对象,则需要在类中添加构造函数如下
查询方法如下
【不定期持续更新,未完待续】