洞察管理小程序实例的关键在于实现跨平台能力与数据安全,如何利用FinClip助力企业在数字化转型中既合规又高效?
847
2022-09-30
SpringData JPA的常用语法汇总
目录前言1.方法方式方法说明例子2.注解方式注解说明例子多表联查,且多条件、分页查询怎么写?小结总结
前言
SpringData JPA常用有两种写法,一个是用Jpa自带方法进行CRUD,适合简单查询场景、例如查询全部数据、根据某个字段查询,根据某字段排序等等。另一种是使用注解方式,@Query、@Modifying。
1.方法方式
方法说明
接口方法如下,方法作用见注释:
public interface JpaRepository
// 无条件,查询全部记录
List
// 排序查询
List
// 根据主键ID查询
List
// 批量保存集合数据
List saveAll(Iterable var1);
void flush();
S saveAndFlush(S var1);
// 批量删除
void deleteInBatch(Iterable
// all in 全部删除
void deleteAllInBatch();
// 查询一条记录
T getOne(ID var1);
// 条件查询
List findAll(Example var1);
// 条件查询,带排序
List findAll(Example var1, Sort var2);
}
例子
一般dao实现JpaRepository接口,直接调用JpaRepository中的方法就可以实现了简单查询,例如查询User实例列表:
// 构建user的Example对象
Example
List 2.注解方式 jpa实现CRUD的主要注解是@Query 注解说明 @Query注解主要有以下参数,参数作用如下: value:SQL语句countQuery: 分页查询时统计总数nativeQuery: 使用执行这个方法的时候执行原生sql语句,直接写数据库中的实际表名和表的实际字段名 @Query的代码如下: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @QueryAnnotation @Documented public @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_id进行排序查询task集合 @Query(value = "select tvcTnVEFjJask_id,task_date from task order by task_id", nativeQuery = true) List 使用注解方式条件查询 条件查询时可以使用字段名 操作符 ?;例如: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 ", nathttp://iveQuery = true) List 使用注解方式修改 修改一条数据需要加上@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的多表联查的例子来说明复杂的查询要怎么写。下面是user表task表关联查询出任务名称、任务ID、用户名称这些信息,并且根据task_name、task_date进行过滤;根据task_date倒序。 共有几点需要注意: 多表联查使用正常的JOIN就可以多条件是常见的情况,需要区别传入的条件是否要去执行,这种情况需要使用where 1=1 and 这种方式来保证条件不传时仍然正常查询。分页查询需要传入分页参数Pageable,并且写countQuery来统计总数。多条件查询关键:if(:参数!='',k.字段名 =:参数,1=1),这里是使用了if进行判断,这个写法类似Mybatis xml中的 代码: @Query(value = " select a.task_name, a.task_id,u.user_name" + " frvcTnVEFjJom 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 小结 以上列举了两种JPA的crud方式,jpa方法与注解方式,平时写代码时更倾向于使用注解方式去写原生sql来实现业务。对于简单查询可以用JpaRepository里面这些方法就够用了,对于更复杂的场景推荐使用@Query写sql的方式来实现。 jpa方法可以屏蔽底层的sql,如果有不同数据库实现的服务,用jpa方法可以免于修改sql。但是jpa方法对于分组查询、limit支持、多条件、多表联查这些不太友好。 总结
2.注解方式
jpa实现CRUD的主要注解是@Query
注解说明
@Query注解主要有以下参数,参数作用如下:
value:SQL语句countQuery: 分页查询时统计总数nativeQuery: 使用执行这个方法的时候执行原生sql语句,直接写数据库中的实际表名和表的实际字段名
@Query的代码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@QueryAnnotation
@Documented
public @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_id进行排序查询task集合
@Query(value = "select tvcTnVEFjJask_id,task_date from task order by task_id", nativeQuery = true)
List
使用注解方式条件查询
条件查询时可以使用字段名 操作符 ?;例如: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 ", nathttp://iveQuery = true)
List
使用注解方式修改
修改一条数据需要加上@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的多表联查的例子来说明复杂的查询要怎么写。下面是user表task表关联查询出任务名称、任务ID、用户名称这些信息,并且根据task_name、task_date进行过滤;根据task_date倒序。
共有几点需要注意:
多表联查使用正常的JOIN就可以多条件是常见的情况,需要区别传入的条件是否要去执行,这种情况需要使用where 1=1 and 这种方式来保证条件不传时仍然正常查询。分页查询需要传入分页参数Pageable,并且写countQuery来统计总数。多条件查询关键:if(:参数!='',k.字段名 =:参数,1=1),这里是使用了if进行判断,这个写法类似Mybatis xml中的
代码:
@Query(value =
" select a.task_name, a.task_id,u.user_name" +
" frvcTnVEFjJom 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
小结
以上列举了两种JPA的crud方式,jpa方法与注解方式,平时写代码时更倾向于使用注解方式去写原生sql来实现业务。对于简单查询可以用JpaRepository里面这些方法就够用了,对于更复杂的场景推荐使用@Query写sql的方式来实现。
jpa方法可以屏蔽底层的sql,如果有不同数据库实现的服务,用jpa方法可以免于修改sql。但是jpa方法对于分组查询、limit支持、多条件、多表联查这些不太友好。
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~