本文为JPA的学习采坑,如有问题欢迎指正。

JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询。所以想要寻找一种好用的解决方案。

JPA多表关联的实现方式


1.使用Specification实现映射关系匹配,如@ManyToOne等

2.使用NativeQuery等sql或hql来实现

优缺点对比


1.映射关系是hibernate的入门基础,很多人都会习惯去使用。个人不太喜欢这种方式,复用性太弱,且不灵活特别是在多表复杂业务情况下。

2.使用Specification方式需要继承JpaSpecificationExecutor接口,构造对应的方法后传入封装查询条件的Specification对象。逻辑上简单易懂,但是构造Specification对象需要拼接格式条件非常繁琐。

3.直接使用NativeQuery等方式实现复杂查询个人比较喜欢,直观且便利,弊端在于无法返回自定义实体类。需要手动封装工具类来实现Object到目标对象的反射。

使用sql并返回自定义实体类


个人比较喜欢的实现方式,不多说看代码


  1. import org.springframework.stereotype.Repository;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.PersistenceContext;
  4. import javax.transaction.Transactional;
  5. @Repository
  6. public class EntityManagerDAO {
  7. @PersistenceContext
  8. private EntityManager entityManager;
  9. /**
  10. * 人员列表排序
  11. * @return
  12. */
  13. @Transactional
  14. public List<BackstageUserListDTO> listUser(){
  15. String sql = "select a.create_time createTime," +
  16. "a.mobilephone phoneNum," +
  17. "a.email email,a.uid uid," +
  18. "a.enabled enabled," +
  19. "c.id_number idNumber," +
  20. " (case b.`status` when 1 then 1 else 0 end) status " +
  21. "from tbl_sys_user a " +
  22. "LEFT JOIN user_high_qic b on a.uid=b.u_id" +
  23. "LEFT JOIN user_qic c on a.uid=c.uid " +
  24. "ORDER BY status desc";
  25. SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(SQLQuery.class);
  26. Query query =
  27. sqlQuery.setResultTransformer(Transformers.aliasToBean(BackstageUserListDTO.class));
  28. List<BackstageUserListDTO> list = query.list();
  29. entityManager.clear();
  30. return list;
  31. }
  32. }

  1. public class BackstageUserListDTO implements Serializable{
  2. private static final long serid = 1L;
  3. private String createTime;
  4. private String phoneNum;
  5. private String email;
  6. private BigInteger uid;
  7. private Integer enabled;
  8. private String idNumber;
  9. private BigInteger status;
  10. //GETTER SETTER
  11. }

这样一个需求如果使用前两种方式实现,无疑会非常麻烦。使用这种方式能够直接反射需要的自定义实体类。

可以根据需求整理封装成不同的方法,加入排序,分页等。

主要提供一种方便的解决思路,有问题欢迎指正

2019-07-10更新

新版的API使用方法如下(旧版本Map转实体会提示不能强转)

    
Query nativeQuery = entityManager.createNativeQuery(sql, ArchiveMonthlyInfoBO.class);
List list = nativeQuery.getResultList();

原文地址:https://blog.csdn.net/lw5885799/article/details/81103183

JPA使用nativequery多表关联查询返回自定义实体类的更多相关文章

  1. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

  2. 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

    查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...

  3. SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询

    1 业务需求 有的系统业务逻辑比较复杂,存在着多表关联查询的的情况,查询的内容不仅仅是单张表的的内容而是多张表的字段组合而成的,直接使用SplringDataJPA实现是比较复杂的,但是如果使用Que ...

  4. mongodb操作之使用javaScript实现多表关联查询

    一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示:

  5. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

  6. 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...

  7. Mybatis-plus多表关联查询,多表分页查询

    学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...

  8. 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?

    概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...

  9. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

随机推荐

  1. useradd -M -s /sbin/nologin mysql -g mysql 报错 Creating mailbox file

    由于之前使用以下命令删除了mysql账户 userdel mysql groupdel mysql      #如果删除了mysql用户,对应的组也会被删除(只有一个用户的情况下) 执行以下命令时报错 ...

  2. 浅谈java.util.ConcurrentModificationException(并发修改异常)

    java中的list集合是我们经常使用的集合,而对集合进行增加和删除元素是我们最常用的操作.那么在什么时候对list集合什么样的操作,就会发生java.util.ConcurrentModificat ...

  3. CSS中position和header和overflow和background

    <!DOCTYPE html> <!--CSS中position属性--> <html lang="en"> <head> < ...

  4. 一些js面试高频知识点的总结

    第一部分:Object Prototypes (对象原型) (1)定义一个方法,要求传入一个string类型的参数,然后将string的每个字符间加个空格返回,例如: spacify('hello w ...

  5. Hackerrank--Team Formation

    题目链接 For an upcoming programming contest, Roy is forming some teams from the n students of his unive ...

  6. java 判断数据类型和方法

    java 判断数据类型和方法 .我从SOLR查询中获取一个数据一,已知数据类型,是string或者int 或者其他 .我有一个方法(set方法),只有一个参数,但是我不知道参数的数据类型,可能是str ...

  7. LINUX访问文件配置

    访问文件 /etc/host.conf 告诉网络域名服务器如何查找主机名.(通常是 /etc/hosts,然后就是名称服务器:可通过 netconf 对其进行更改) /etc/hosts 包含(本地网 ...

  8. 洛谷 USACO P2207 Photo

    P2207 Photo 题目描述 Framer Jhon 打算给他的N头奶牛照相,( 2 <= N <= 1 000 000 000) . 他们排成一条线,并且依次取1~N作为编号. 每一 ...

  9. XtraBackup构建MySQL主从环境的方法

    环境:HE3主库,HE1从库HE1:192.168.1.248HE3:192.168.1.250从库my.cnf加入以下参数并重启数据库:read_only=1log_slave_updates=1( ...

  10. 【每日一linux命令7】用户及用户组

    一.查询用户及用户组相关命令 1.whoami 查询当前登录的用户名 2.groups 查询当前登录用户名所在的用户组 3.groups root 查询root用户名所在的用户组 二.怎么批量查看用户 ...