JPA原生sql返回值转自定义实体类

柔情只为你懂 2023-06-11 12:27 95阅读 0赞

有两个月没更新过CSDN了,裸辞了,半个月前刚入职了新下家,这里适应下新公司的项目技术。

持久层用的是之前没用过的jpa,还好平时多多少少也有学过,上手也快。

用jpa写原生sql的时候,真的想骂人,各种问题。可是jsql又不支持sql的一些函数,只能写原生sql。

这里就先记录第一个坑,用jpa注解查询完之后发现无法用以往的实体类直接映射接收,百度谷歌无果…

这里实在没办法,用了个笨办法,将结果集用工具类转成实体类再返回。

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. /**
  9. * @author 954L
  10. * @create 2019/10/30 17:27
  11. */
  12. public class EntityUtils {
  13. /**
  14. * 将数组数据转换为实体类
  15. * 此处数组元素的顺序必须与实体类构造函数中的属性顺序一致
  16. *
  17. * @param list 数组对象集合
  18. * @param clazz 实体类
  19. * @param <T> 实体类
  20. * @param model 实例化的实体类
  21. * @return 实体类集合
  22. */
  23. public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz, Object model) {
  24. List<T> returnList = new ArrayList<T>();
  25. if (list.isEmpty()) return returnList;
  26. Object[] co = list.get(0);
  27. List<Map> attributeInfoList = getFiledsInfo(model);
  28. Class[] c2 = new Class[attributeInfoList.size()];
  29. if (attributeInfoList.size() != co.length) {
  30. return returnList;
  31. }
  32. for (int i = 0; i < attributeInfoList.size(); i++) {
  33. c2[i] = (Class) attributeInfoList.get(i).get("type");
  34. }
  35. try {
  36. for (Object[] o : list) {
  37. Constructor<T> constructor = clazz.getConstructor(c2);
  38. returnList.add(constructor.newInstance(o));
  39. }
  40. } catch (Exception ex) {
  41. return returnList;
  42. }
  43. return returnList;
  44. }
  45. private static Object getFieldValueByName(String fieldName, Object modle) {
  46. try {
  47. String firstLetter = fieldName.substring(0, 1).toUpperCase();
  48. String getter = "get" + firstLetter + fieldName.substring(1);
  49. Method method = modle.getClass().getMethod(getter, new Class[]{});
  50. Object value = method.invoke(modle, new Object[]{});
  51. return value;
  52. } catch (Exception e) {
  53. return null;
  54. }
  55. }
  56. private static List<Map> getFiledsInfo(Object model) {
  57. Field[] fields = model.getClass().getDeclaredFields();
  58. List<Map> list = new ArrayList(fields.length);
  59. Map infoMap = null;
  60. for (int i = 0; i < fields.length; i++) {
  61. infoMap = new HashMap(3);
  62. infoMap.put("type", fields[i].getType());
  63. infoMap.put("name", fields[i].getName());
  64. infoMap.put("value", getFieldValueByName(fields[i].getName(), model));
  65. list.add(infoMap);
  66. }
  67. return list;
  68. }
  69. }
  70. @Query(value = "select ID as id, ITEM_NAME as itemName, IS_SORT as isSort from SPF_OT_TAX_ITEM " +
  71. "WHERE PARENT_ID = :parentId", nativeQuery = true)
  72. List<Object[]> queryTaxItemVOByParentId(@Param("parentId") String parentId);
  73. @Override
  74. public List<TaxItem.TaxItemVO> queryTaxItemVOByParentId(String parentId) {
  75. List<Object[]> objects = taxItemRepository.queryTaxItemVOByParentId(parentId);
  76. return EntityUtils.castEntity(objects, TaxItem.TaxItemVO.class, new TaxItem.TaxItemVO());
  77. }
  78. public static class TaxItemVO{
  79. private String id;
  80. private String itemName;
  81. private Integer isSort;
  82. public TaxItemVO() {
  83. super();
  84. }
  85. public TaxItemVO(String id, String itemName, Integer isSort) {
  86. this.id = id;
  87. this.itemName = itemName;
  88. this.isSort = isSort;
  89. }
  90. public String getId() {
  91. return id;
  92. }
  93. public void setId(String id) {
  94. this.id = id;
  95. }
  96. public String getItemName() {
  97. return itemName;
  98. }
  99. public void setItemName(String itemName) {
  100. this.itemName = itemName;
  101. }
  102. public Integer getIsSort() {
  103. return isSort;
  104. }
  105. public void setIsSort(Integer isSort) {
  106. this.isSort = isSort;
  107. }
  108. }

对你有帮助的话,右上角给个赞呗~

发表评论

表情:
评论列表 (有 0 条评论,95人围观)

还没有评论,来说两句吧...

相关阅读

    相关 定义 JPA 实体

    1. 简介 在本教程中,我们将了解实体的基础知识,以及在 JPA 中定义和自定义实体的各种注释。 2. 实体 JPA 中的实体只不过是表示可以持久保存到数据库的数