zoukankan      html  css  js  c++  java
  • JPA使用nativequery多表关联查询返回自定义实体类

     

    本文为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

  • 相关阅读:
    个人技术博客(α)
    git常用命令合集
    软件工程实践2017第二次结对作业
    软件工程实践2017第一次结对作业
    软件工程实践2017第二次作业
    软件工程实践2017第一次作业
    学习总结
    约瑟夫
    今天是星期几
    斐波那契数列取石子游戏
  • 原文地址:https://www.cnblogs.com/jpfss/p/11162646.html
Copyright © 2011-2022 走看看