<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      只為成功找方向,不為失敗找借口

      每天都不能停止前進的腳步
        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      spring data jpa 查詢自定義字段,轉換為自定義實體

      Posted on 2018-08-22 10:36  冰碟  閱讀(8778)  評論(1)    收藏  舉報

      目標:查詢數據庫中的字段,然后轉換成 JSON 格式的數據,返回前臺。

      環境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 
      背景:首先建立 entity 映射數據庫(非專業 java 不知道這怎么說)

      @Entity
      @Table(name = "user")
      public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private Long id;
          private String userName;    // 賬號
          private String password;    // 密碼
          // getter setter 方法略過
      }
      

        

      然后建立與之對應的 model

      public class UserModel implements Serializable {
          // 一些屬性
      }

       

      這里我們分情況討論

      首先第一種情況:查詢的字段與表中的字段全部對應(就是查表里所有的字段,但是使用 Model 作為接收對象)

      這種情況比較簡單,調用 Repository 提供的方法,返回一個 entity , 然后將 entity 的屬性復制到 model 中。像這樣

      UserModel user = new UserModel();
      User userEntity = new User();
      // 一個工具類,具體使用方法請百度
      BeanUtils.copyProperties(user, userEntity);

       

      第二種情況:只查詢指定的幾個字段

      現在我有張表,有字段如下:

      @Entity
      @Table(name = "user_info")
      public class UserInfo {
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private Long id;
          private String name = "用戶";     // 昵稱
          private String signature;         // 個性簽名
          private String gender = "未知";   // 性別
          private String description;       // 個人說明
          private String avatar;            // 頭像
          private Long role;                // 權限
          private Boolean disable;          // 是否凍結
          private Date createTime;          // 創建時間
          private Boolean isDelete;         // 是否刪除
          private Long userId;              // 用戶 Id
          // ...
      }

       

      但是我只需要查詢指定的幾個字段,然后轉換成 JSON,返回給前臺,咋辦呢?

      第一種方法:使用 model 查詢時轉化

      首先建立一個 model ,寫上自己想要查詢的字段,然后寫上構造函數,這步很重要,因為spring jpa 轉化時會調用這個構造方法

      public class MyModel implements Serializable {
      
          private String userName;
          private String name;
          private String gender;
          private String description;
      
          public MyModel() {};
      
          public MyModel(String userName, String name, String gender, String description) {
              this.userName = userName;
              this.name = name;
              this.gender = gender;
              this.description = description;
          }
      }

       

      然后在 dao 類中寫查詢方法

      @Query(value = "select new pers.zhuch.model.MyModel(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
      public List<MyModel> getAllRecord();

       

      直接在查詢語句中 new model 框架底層會調用它,然后返回這個對象(這里我寫了完整的類路徑,不寫的時候它報錯說找不到類型什么的)

      然后就可以獲得只有指定字段的 model 了。然后就把它轉成 JSON 格式就 O 了。

      第二種方法:在service 里邊轉換成 JSON

      原理其實和第一種方法差不多,只是處理結果的方式不太一樣,只是這種方法我們就不在 hql 中 new Model 了,直接寫查詢方法

      @Query(value = "select new map(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
      public List<Map<String, Object>> getCustomField();

       

      直接new map(這里得是小寫,不知道大寫有木有問題,反正沒試,編譯器提示是要小寫的) 
      然后返回的結果是這樣的

      [
          {
              "0": "admin", 
              "1": "你猜", 
              "2": "男", 
              "3": "一段描述"
          }, {
              "0": "abc", 
              "1": "你猜人家", 
              "2": "女", 
              "3": "沒事先掛了"
          }
      ]

       

      然后在 service 層里直接封裝成 JSON 對象,返回

      List<JsonObject> list = new ArrayList();
      for(Map map : result) {
          JsonObject j = new JsonObject();
          j.addProperty(attrName, val);
          ...
          list.add(j);
      }
      gson.toJson(list);

       

      還有一種返回結果,這樣寫:

      @Query(value = "select u.userName, ui.name, ui.gender, ui.description from UserInfo ui, User u where u.id = ui.userId")
      public List<Object> getCustomField();

       

      返回結果是這樣的格式:

      [
          [
              "admin", 
              "你猜", 
              "男", 
              "一段描述"
          ], [
              "abc", 
              "你猜人家", 
              "女", 
              "沒事先掛了"
          ]
      ]

       

      返回的是數組,也一樣可以通過上面的方法轉成 json ,這里我的程序中出現了一點點 BUG,就是空值的字段不會在數組中,不知道為什么。

      這種方法必須明確的知道查詢了哪些字段,靈活性比較差,雖然它解決了手頭的問題。還有就是版本的不同,有可能會出現丟失空字段的情況,我個人特別的不喜歡這樣的方法,萬一我實體幾十個字段,寫著寫著忘了寫到哪了,就 over 了

      第三種方法:返回一個便于轉換成 json 格式的 list

      其實和上面很相似,都是 dao 層返回一個 List < Map < String, Object >>,但是上面的結果集返回的 Map 的 key 只是列的下標,這種方式稍微理想一點點,就是 Map 的 key 就是查詢的列名。但是這種方式需要實現自定義 Repository( 這里不詳細介紹,請自行百度 ),并且只是 jpa 集成 hibenate 的時候可以使用。

      public List getCustomEntity() {
          String sql = "select t.id, t.name, t.gender, t.is_delete, t.create_time, t.description from t_entity t";
          Query query = em.createNativeQuery(sql);
          // Query 接口是 spring-data-jpa 的接口,而 SQLQuery 接口是 hibenate 的接口,這里的做法就是先轉成 hibenate 的查詢接口對象,然后設置結果轉換器
          query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
          return query.getResultList();
      }

       

      這種方法返回的就是比較標準的 JSON 格式的 java 對象了,只需要用 jackson 或者 Gson 轉一下就是標準的 json 了

      [
          {
              attr: val,
              ...
          },
          {
              attr: val,
              ...
          },
      ]

       

      這種方式其實已經比較理想了,因為直接就能返回到前臺,但是有時候,結果不是一條 sql 能夠解決的,得兩條或者以上的 sql 來解決一個復雜的查詢需求,這個過程中,結果比較需要轉換成 pojo,以便于組裝操作。

      第四種方案:dao 中直接轉成 pojo 返回

      這個方案還是依賴于 hibenate,有點操蛋,但是更明確一些。

      public List getCustomEntity() {
          String sql = "select t.id, t.name, t.gender, t.is_delete as isEnable, t.create_time as createTime, t.description from t_entity t";
          Query query = em.createNativeQuery(sql);
          query.unwrap(SQLQuery.class)
          // 這里是設置字段的數據類型,有幾點注意,首先這里的字段名要和目標實體的字段名相同,然后 sql 語句中的名稱(別名)得與實體的相同
                  .addScalar("id", StandardBasicTypes.LONG)
                  .addScalar("name", StandardBasicTypes.STRING)
                  .addScalar("gender", StandardBasicTypes.STRING)
                  .addScalar("isEnable", StandardBasicTypes.BOOLEAN)
                  .addScalar("createTime", StandardBasicTypes.STRING)
                  .addScalar("description", StandardBasicTypes.STRING)
                  .setResultTransformer(Transformers.aliasToBean(EntityModel.class));
          return query.getResultList();
      }

       

      這次返回的就是 List 了。這里要注意的是 StandardBasicTypes這個常量類,在一些舊版本中,是 Hibenate 類,具體哪個包我不知道,我這個版本中是換成了前面的那個常量類

      主站蜘蛛池模板: 国产超高清麻豆精品传媒麻豆精品| √天堂中文www官网在线| 波密县| 色综合视频一区二区三区| 永久免费AV无码网站大全| 欧美成人精品三级网站视频| 亚洲成av人片在www鸭子| 中文字幕久久熟女蜜桃| 亚洲av永久无码精品天堂久久| 亚洲欧美中文字幕日韩一区二区| 女同在线观看亚洲国产精品| 国产亚洲精品VA片在线播放| 探索| 亚洲熟少妇一区二区三区| 中文字幕亚洲综合第一页| 色偷偷久久一区二区三区| 搡bbbb搡bbb搡| 久久精品熟女亚洲av艳妇| 免费吃奶摸下激烈视频| 亚洲色欲色欱WWW在线| 国产精品色哟哟成人av| 色哟哟网站在线观看| 人妻丰满熟妇av无码处处不卡| 日韩精品一区二区都可以| 欧洲精品免费一区二区三区| 国产成人综合亚洲第一区| 亚洲av男人电影天堂热app| 人妻少妇久久中文字幕| 色偷偷成人综合亚洲精品| 人妻少妇456在线视频| 久久精品国产99国产精品澳门| 久久av高潮av喷水av无码| 免费a级毛片18以上观看精品 | 中国美女a级毛片| 亚洲欧洲日产国码久在线| 国产精品一区二区蜜臀av| 国产在线不卡精品网站| 无码专区 人妻系列 在线 | 无码国产精品一区二区免费虚拟vr | 亚洲午夜理论无码电影| 精品国产成人午夜福利|