当前位置: 首页 > article >正文

SpringBoot使用JpaRepository方法命名和@Query查询的一些复杂场景

一.背景

       公司安排了师带徒的任务,我个人也经历了JSP文件中写SQL、数据库视图和存储过程、JDBC写SQL、Dorado、ibatis、mybatis、Hibernate的HQL、JPA的JPQL、JPA的CriteriaQuery等各类跟关系数据打交道的组件语言。最近几年利用SpringBoot的JpaRepository方法命名查询和@Query注解查询多一些,今天总结一下。

二.JpaRepository方法命名

   1.先看个我的复杂需求

        简单的,大家都容易会,我想从一个复杂的需求来入手,快速了解掌握方法命名查询的要点。我的需求是这样的,想根据某个属性大于等于一个值并取最小的1条,我的方法命名是这样的:

Optional<HistoryDayData> findFirstByDayGreaterThanEqualOrderByDayAsc(@Param("day") LocalDate day);

JpaRepository完美的理解到了我的意图。生成出来的sql如下:

select
        historyday0_.id,
        ......
    from
        history_day_data historyday0_ 
    where
        historyday0_.day>=? 
    order by
        historyday0_.day asc limit ?

跟预期一致。

2.官方的标准资料

      参考JPA的Repository详解_jparepository-CSDN博客,我们再来学习一下别人详细的方法命名查询内容:

KeywordSampleJPQL snippet
AndfindByNameAndPwdwhere name= ? and pwd =?
OrfindByNameOrSexwhere name= ? or sex=?
Is,EqualsfindById,findByIdEqualswhere id= ?
BetweenfindByIdBetweenwhere id between ? and ?
LessThanfindByIdLessThanwhere id < ?
LessThanEqualsfindByIdLessThanEqualswhere id <= ?
GreaterThanfindByIdGreaterThanwhere id > ?
GreaterThanEqualsfindByIdGreaterThanEqualswhere id > = ?
AfterfindByIdAfterwhere id > ?
BeforefindByIdBeforewhere id < ?
IsNullfindByNameIsNullwhere name is null
isNotNull,NotNullfindByNameNotNullwhere name is not null
LikefindByNameLikewhere name like ?
NotLikefindByNameNotLikewhere name not like ?
StartingWithfindByNameStartingWithwhere name like ‘?%’
EndingWithfindByNameEndingWithwhere name like ‘%?’
ContainingfindByNameContainingwhere name like ‘%?%’
OrderByfindByIdOrderByXDescwhere id=? order by x desc
NotfindByNameNotwhere name <> ?
InfindByIdIn(Collection<?> c)where id in (?)
NotInfindByIdNotIn(Collection<?> c)where id not in (?)
TruefindByAaaTuewhere aaa = true
FalsefindByAaaFalsewhere aaa = false
IgnoreCasefindByNameIgnoreCasewhere UPPER(name)=UPPER(?)
topfindTop10top 10/where ROWNUM <=10

3.其他特殊的想法

(1)如果查询要返回一条就是Optional<xxx> findFirstByXXXXX

(2)如果查询要返回分页就Page<xxx> findByxxxxx(xxxx,...,Pageable pageable)

(3)匹配One端关联对象的属性怎么办?OneToOne和ManyToOne的One端

HistoryDayData与Stock是ManyToOne的关系,Many端中One端的属性首字母大写哦!我这里属性的名字是stock,我想匹配它内部的code属性,所以我是ByStockCode

Optional<HistoryDayData> findFirstByStockCodeAndDayGreaterThanEqualOrderByDayAsc(String code,LocalDate day );

生成的SQL如下:

select
        historyday0_.id ,
        ......
    from
        history_day_data historyday0_ 
    left outer join
        stock stock1_ 
            on historyday0_.stock_id=stock1_.id 
    where
        stock1_.code=? 
        and historyday0_.day>=? 
    order by
        historyday0_.day asc limit ?

(4)匹配Many端关联对象的属性怎么办?OneToMany和ManyToMany的Many端

Stock与HistoryDayData是OneToMany的关系,One端中Many端的属性首字母大写哦!我查询Stock,想匹配其historyDayDatas内部的Day属性,我写的就是ByHistoryDayDatasDay。

Optional<Stock> findByHistoryDayDatasDay(LocalDate day);

生成的SQL如下:

    select
        stock0_.id,
        ...... 
    from
        stock stock0_ 
    left outer join
        history_day_data historyday1_ 
            on stock0_.id=historyday1_.stock_id 
    where
        historyday1_.day=?

4.无法实现的情况

     一般,某个查询方法会提供几个查询条件,如果用户没有输入某个查询条件就忽略该属性的匹配。这样的需求,方法命名就实现不了啦。。。。。。得用@Query了。

三.@Query的使用

    如果希望是没有输入day就忽略对day属性的匹配就应该为如下:

@Query(" select p from  HistoryDayData p where (:day is null or p.day>=:day) order by p.day asc ")

四.总结

     JpaRepository方法命名和@Query查询各有所长。对用户查询使用的建议@Query吧,需求怪异的多些。内部模型间逻辑的用JpaRepository方法命名查询还是很高效的,可读性也很强。


http://www.kler.cn/a/370722.html

相关文章:

  • ToDesk设置临时密码和安全密码都可以当做连接密码使用
  • .NET 学习:从基础到进阶的全面指南
  • 精选算法合集
  • ubuntu开机自启某个应用
  • Re78 读论文:GPT-4 Technical Report
  • 深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用
  • js 简单模拟JSON.stringify 功能
  • 初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序
  • [vulnhub]Kioptrix: Level 1.2 (#3)
  • 2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷
  • 赛博威携手百度智能云,开启数字营销新未来
  • Docker Compose一键部署Spring Boot + Vue项目
  • CSS3新增长度单位
  • 在Ubuntu(Linux)系统下安装Anaconda3
  • Kubernetes固定Pod IP和Mac地址
  • 手机号二要素核验 API 对接说明
  • 【04】RabbitMQ的集群机制
  • Ajax:表单 模板引擎
  • smuge error
  • 2025秋招八股文--服务器篇
  • 我接触csdn中的c++的时间
  • 简记Vue3(二)—— computed、watch、watchEffect
  • 【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • 使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图
  • 【Python小游戏12——愤怒的小鸟】
  • 【MySQL】实战篇—项目需求分析:ER图的绘制与关系模型设计