SpringBoot JPA实践之小技巧汇总

JPA Hibernate相关的API文档地址 https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/query/native/Native.html(提供了非常详细的关于原生SQL的查询使用) https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/query/hql/HQL.html Repository的三种定义方式 ① 使用本系列文章中的BaseRepository,统一使用全部集成后的Repository,方便记忆; ② 直接使用...

文章分类:后端一部分 Spring Boot Jpa

JPA小技巧

SpringBoot JPA实践之表达式自定义属性与方法

本篇文章来实现一下SpringBoot JPA的@Query注解中支持的表达式自定义与方法自定义,首先来说这两个功能可能并没有什么应用价值,同时在集成JPA环境时存在一些自定义的实现,并未在实际项目中实践,所以个人不是很建议实际去应用它们,但是作为一些有实践意义的知识点来学习参考总归是有较大的意义的,毕竟这也是一个知识点的深度挖掘。一直想着扩展一下JPA的动态查询条件,却机缘巧合的实现了自定义的表达式与自定义方法的集成,总归是令人欣喜的。 JPA原生SQL提供内置的变量{h-schema}、{h-domain}、${h-catalog}、#{#entityName}等等,今天本文将实现在SQL中内置一些我们自己的属性和方法,类似{h-schema},如表达式的调用为“?#{cdd.chendd}”,方法的调用为“?#{hello()}”,cdd为自定义属性前缀,chendd为属性名称,将输...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之Specification查询分页

前文在介绍全量API函数的时候有列出来findAll函数中有个Specification类型的参数,它也是JPA实现的基于对象查询的动态查询方式,它可以实现多表级联情况的参数查询,但由于个人不喜欢在Entity中配置一对一、一对多等场景,故不对其关联对象的查询实现做深入研究,实际应用的时候写SQL查询本站有提供另外一种非常方便的实现。 代码实现 Dao /** * Specification查询 * * @author chendd * @date 2020/5/2 22:18 */ @Repository public class UserPageDao { @Resource private UserRepository userRepository; public Page<User> queryUsersPage(final User user , I...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之EntityManage查询返回自定义DTO的代理实现

根据前文中的代码实现示例,将实现一个接口代理查询返回自定义DTO的实现,与JPA自带的@Query查询实现类似,主要是将SQL查询出的结果集转换为普通Bean对象,依赖EntityManager对象提供的方法,自动将查询的结果集映射为Map<String,Object>、DTO、List<Map<String,Object>>、List<DTO>,具体使用参考如下。 SQL查询结果集返回为Map结构 package cn.chendd.example.jpa.user.repository; import cn.chendd.example.jpa.nativequery.annotions.Query; import cn.chendd.example.jpa.nativequery.annotions.QueryResult; import cn.chendd.example.jpa....

文章分类:后端一部分 Spring Boot Jpa

JPA 动态代理

SpringBoot JPA实践之EntityManage查询返回自定义DTO

在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与@Query注解查询返回接口结果集相似),本篇文章围绕不使用任何Entity与对象级联配置的情况,将原生SQL查询的结果集转换为自定义DTO对象。 参考代码 package cn.chendd.example.jpa.user.dao; /** * @author chendd * @date 2020/5/5 22:26 */ @Repository @Transactional(readOnly = true) public class UserQueryCustomResultDao { @PersistenceContext private EntityManager entityM...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之@Query查询之分页实现

@Query注解提供了对分页的支持,通常的分页需要两个SQL,一个是查询count语句,一个是查询data语句,使用起来比较简单,直接最后一个参数传递pageable类型参数即可,至于是否使用可自行斟酌。 网络上有些资料里所述的使用特殊表达式“ORDER BY ?#{#pageable}”来实现分页,这种方式我在Oracle中也用过一次,印象中这种方式实现的分页查询在翻页至最后一页时,系统内部会打印输出一个错误信息的Log,不影响实际运行,本文中采用现时间的最新版本,下面为对应的具体实现。 代码实现一(查询返回Entity) Repository /** * 查询分页:User类型为Entity对象 * * @author chendd * @date 2020/5/2 21:22 */ public interface UserQueryPageRepository exte...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之@Query查询之接口结果集

前面几篇文章中已经飞起来了多种场景的案例了,有个细节没有提到,@Query注解查询返回的结果集仍然必须是Entity类,但是通常情况更多的复杂查询将查询的是一个自定义对象(Dto):自定义Javabean,而JPA是支持查询返回自定义对象的,但它返回的对象类型必须是接口类型,其接口的具体实现被JPA代理实现(本站有类似的代理接口实现类的实现),匹配规则接口中的函数名称 = get + 数据库字段名即可,如果某个字段需要二次加工,则使用JDK8中接口的默认方法解决。 代码实现 Repository /** * 查询返回接口类型 * * @author chendd * @date 2020/5/2 20:44 */ public interface UserQueryInterfaceResultRepository extends BaseRepository<User, St...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之@Query查询之动态查询条件

通过前面一篇文章介绍了查询时传递参数的3种方式,包含了对于@Query注解查询的基本使用,如参数等值查询、参数模糊查询、及参数集合 in 的查询方式,然而实际应用中绝不会都是这么简单的查询,往往伴随的是参数动态查询,即当参数值为空时不使用该参数,通常包含场景是单个参数的匹配与数组结构的参数匹配,详细实现如下。 代码实现 Repository /** * 根据参数构造动态查询条件 * * @author chendd * @date 2020/5/1 23:44 */ public interface UserQueryDynamicParamRepository extends BaseRepository<User , String> { /** * 常规动态参数实现:出现多少次 ? 则需要定义多少个方法参数 */ @Query(value = "select a.* from user...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之@Query查询之参数传参方式

@Query注解查询是一个非常强大的查询实现,基本上日常的各种复杂查询使用它均可实现,本篇文章主要介绍使用@Query查询时的参数传递实现方式,常用的参数传递有3中方式,分别是“?”、“?数字”、“:属性”,第一种最常见,但是不能用于动态个数的参数,后面两种则可以满足动态参数个数的场景,所以后面的两种更加强大,但是使用“:属性”的方式比使用“?数字”的方式更加易于阅读,所以我也建议使用第三种方式。 参数解析实现 “?”:与JDBC中的参数赋值类似,这个类型的大家肯定不会陌生,当一个参数被使用一次以上时,此种方式需要定义两个参数,并且不支持动态个数的参数; “?数字”:可以满足一个参数被使用多次,并且某个参数类型是数组或者集合的场景,底层解析逻辑是识别到特定规则的数字时候,替换为对应的第数字个参数(猜的); “:属性”:同上,更加易于阅读,底层解析逻辑是识别特殊规则的属性名与方法中方法参数命...

文章分类:后端一部分 Spring Boot Jpa

JPA

SpringBoot JPA实践之Named查询

本文不专业的称为以NamedQuery查询方式为Named查询或者叫命名查询,它的实现是将查询的JPQL及返回结果集类型等信息预定义在Entity类的注解处,通过预先定义的名称和sql语句的方式实现传递名称查询。其实Named查询我一直不太喜欢,有见过但是并未使用过,也不知道它与@Query查询相比哪个更好,本次耗费大量心血来牛刀小试一下(本文所涉及的命名查询均是以为原生SQL查询,对于JPQL的略过),详细参见下文。 定义Entity 测试查询调用 XML定义命名查询 Springboot jpa提供的Named查询可支持将SQL语句写至XML文件当中,这个特点使得我眼前一亮,其实我还是比较倾向将SQL与Java代码分离的,于是就深入的查阅各种资料,无奈资料还是比较少的,特此实践之,将整个过程详细整理分享,其实很多博客文章中都有涉及将Named查询时的SQL定义在xml中,但是都是蜻蜓点...

文章分类:后端一部分 Spring Boot Jpa

JPA
本站信息

 运营时间: 天

 用户数量: 人

 文章数量: 篇

 评论数量: 条

 点赞个数: 个

 最后更新:

标签云