文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringData JPA的常用语法有哪些

2023-07-02 08:02

关注

今天小编给大家分享一下SpringData JPA的常用语法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言

SpringData JPA常用有两种写法,一个是用Jpa自带方法进行CRUD,适合简单查询场景、例如查询全部数据、根据某个字段查询,根据某字段排序等等。另一种是使用注解方式,@Query@Modifying

1.方法方式

方法说明

接口方法如下,方法作用见注释:

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {    // 无条件,查询全部记录    List<T> findAll();    // 排序查询    List<T> findAll(Sort var1);    // 根据主键ID查询    List<T> findAllById(Iterable<ID> var1);    // 批量保存集合数据    <S extends T> List<S> saveAll(Iterable<S> var1);    void flush();     <S extends T> S saveAndFlush(S var1);    // 批量删除    void deleteInBatch(Iterable<T> var1);    // all in 全部删除    void deleteAllInBatch();    // 查询一条记录    T getOne(ID var1);    // 条件查询    <S extends T> List<S> findAll(Example<S> var1);    // 条件查询,带排序    <S extends T> List<S> findAll(Example<S> var1, Sort var2);}

例子

一般dao实现JpaRepository接口,直接调用JpaRepository中的方法就可以实现了简单查询,例如查询User实例列表:

// 构建user的Example对象Example<User> example =Example.of(User);List<User> users = userRepository.findAll(example);

2.注解方式

jpa实现CRUD的主要注解是@Query

注解说明

@Query注解主要有以下参数,参数作用如下:

@Query的代码如下:

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@QueryAnnotation@Documentedpublic @interface Query {    String value() default "";    String countQuery() default "";    String countProjection() default "";    boolean nativeQuery() default false;    String name() default "";    String countName() default "";}

例子

跟正常写sql语句相同,将sql写到value中,并且nativeQuery = true。下面例子是根据task_id进行分组查询task集合

@Query(value = "select task_id from task group by task_id", nativeQuery = true)List<Task> queryByGroup();

根据task_id进行排序查询task集合

@Query(value = "select task_id,task_date from task order by task_id", nativeQuery = true)List<Task> queryOrder();

条件查询时可以使用字段名 操作符 ?;例如:task_date >= ?,使用位置匹配?。也可以使用字段名 操作符 :属性名;例如:task_date >= :startDate,使用属性名匹配,推荐使用后者,如果字段顺序修改,不影响匹配结果。下面是根据任务时间(task_date)段内和未被删除(deleted)的任务

@Query(value = "select task_id,task_date from task where task_date >=? and task_date <=? and deleted=0 ", nativeQuery = true)List<ApptTask> queryDate(@Param("startDate") String startDate, @Param("endDate") String endDate);

修改一条数据需要加上@Modifying用于标识是修改操作,默认事务等级是只读,所以还需要加上@Transactional,这样覆盖了默认的@Transactional才可以执行修改操作。下面是根据task_id更新task表的备注信息

@Transactional(rollbackOn = Exception.class)@Modifying@Query(value = "update task set remark = ? where task_id=?", nativeQuery = true)void updateRemark(@Param("remark") String remark, @Param("taskId") String taskId);

多表联查,且多条件、分页查询怎么写?

复杂的查询需要注意,以下使用一个Mysql的多表联查的例子来说明复杂的查询要怎么写。下面是usertask表关联查询出任务名称、任务ID、用户名称这些信息,并且根据task_nametask_date进行过滤;根据task_date倒序。

共有几点需要注意:

代码:

@Query(value =      " select a.task_name, a.task_id,u.user_name" +      " from task a " +      " LEFT JOIN usert u" +      " ON a.user_id = u.user_id" +      " where  a.deleted=0  " +      " AND if(:taskName!='',a.task_name =:taskName,1=1)" +      " AND if(:startDate!='',a.task_date >=:startDate,1=1)" +      " AND if(:endDate!='',a.task_date <=:endDate,1=1)" +      " order by a.task_date desc"      ,       nativeQuery = true      ,       countQuery =      " select count(*)" +      " from task a " +      " LEFT JOIN usert u" +      " ON a.user_id = u.user_id" +      " where  a.deleted=0  " +      " AND if(:taskName!='',a.task_name =:taskName,1=1)" +      " AND if(:startDate!='',a.task_date >=:startDate,1=1)" +      " AND if(:endDate!='',a.task_date <=:endDate,1=1)" +      " order by a.task_date desc")Page<Map<String,Object>> queryUserTaskPage(@Param("taskName") String taskName, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, @Param("pageable") Pageable pageable);

以上就是“SpringData JPA的常用语法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯