日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:27日期:2023-07-11 13:56:55

目標:查詢數據庫中的字段,然后轉換成 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 類,具體哪個包我不知道,我這個版本中是換成了前面的那個常量類

繼承jpa Repository 寫自定義方法查詢

今天在寫jpa查詢的時候,遇到了添加自定義方法,項目啟動報錯原因,現總結如下:

首先定義實體類

@Entity@Table(name = 'user')Class User{ @Id @GeneratedValue int id; @Column String age; @Column String school; @Column String userName; set,get方法 (省略)}public interface UserRepository extends JpaRepository<User, Long> { List<User> findByUsernameLike(String username); List<User> aaa();}

啟動項目時,項目報錯提示信息為:

org.springframework.data.mapping.PropertyReferenceException: No property aaa found for type com.fpi.safety.common.entity.po.User

再將List<User> aaa();方法去掉后,項目又可以正常啟動運行

是什么原因呢?

經查找,原來是繼承jpa,必須滿足一些規則,規則如下

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

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

Spring Data JPA框架在進行方法名解析時,會先把方法名多余的前綴截取掉,比如find,findBy,read,readBy,get,getBy,然后對剩下的部分進行解析。

假如創建如下的查詢:findByUserName(),框架在解析該方法時,首先剔除findBy,然后對剩下的屬性進行解析,假設查詢實體為User

1:先判斷userName(根據POJO規范,首字母變為小寫)是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步;

2:從右往左截取第一個大寫字母開頭的字符串此處是Name),然后檢查剩下的字符串是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,則重復第二步,繼續從右往左截取;最后假設用戶為查詢實體的一個屬性;

3:接著處理剩下部分(UserName),先判斷用戶所對應的類型是否有userName屬性,如果有,則表示該方法最終是根據“User.userName”的取值進行查詢;否則繼續按照步驟2的規則從右往左截取,最終表示根據“User.userName”的值進行查詢。

4:可能會存在一種特殊情況,比如User包含一個的屬性,也有一個userNameChange屬性,此時會存在混合。可以明確在屬性之間加上“_”以顯式表達意思,比如“findByUser_NameChange )“或者”findByUserName_Change()“

從上面,我們可以得知,jap在解析是,aaa在user類中是沒有屬性的,所以報錯No property aaa found.

如果我們想要使用jap框架,又不想再多增加一個自定義類,則必須符合其命名規則

如果,你記不住jpa的規則也沒關系,你可以自己再多寫一個類來實現自定義查詢方法

如下:

1. 自定義一個接口,該接口用來聲明自己額外定義的查詢。

public interface UseerRepositoryTwo { public List<User> searchUser(String name, int id);}

2. 創建一個接口,該接口 extends JpaRepository 或者 CurdRepository, 以及上面自己定義的接口 UseerRepositoryTwo

public interface UserRepositoryTwoService extends CrudRepository<LogDTO, Integer>, CustomizedLogRepository {}

3. 實現UserRepositoryTwoService

注意此處的類名,必須以 2 中創建的接口的名字UserRepositoryTwoService,后面加上 Impl 來聲明,而不是寫成 UseerRepositoryTwoImpl

public class UserRepositoryTwoServiceImpl implements UserRepositoryTwoService { @Autowired @PersistenceContext private EntityManager entityManager; @Override public List<User> searchLogs(int Id, String name) {...... }}

自己在寫自定義實現即可

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美久久精品一级c片| 夜夜嗨网站十八久久| 亚洲二区三区不卡| 日韩久久精品| 91嫩草精品| 日本a口亚洲| 日韩精品欧美大片| 男女精品网站| 国产视频久久| 久热综合在线亚洲精品| 99日韩精品| 亚洲欧美网站| 亚洲免费影视| 日韩高清一区| 久久wwww| 里番精品3d一二三区| 国产精品久久久久久妇女| 精品一区二区三区中文字幕| 92国产精品| 国产精品国产一区| 欧美成人久久| 亚洲欧美一级| 91亚洲精品在看在线观看高清| 国产乱人伦丫前精品视频| 精品五月天堂| 欧美日韩国产亚洲一区| 日韩三级一区| 97精品国产一区二区三区| 久久精品国产亚洲夜色av网站| 日韩一级欧洲| 久久成人高清| 久久福利精品| 欧美交a欧美精品喷水| 久久中文亚洲字幕| 国产亚洲精品v| 国产精品亚洲一区二区在线观看| 成人台湾亚洲精品一区二区| 久久亚洲不卡| 日韩久久精品网| 日韩欧美中文字幕一区二区三区| 另类专区亚洲| 日韩精品导航| 成人精品亚洲| 亚洲精品大全| 国产精选在线| 91嫩草精品| 鲁大师成人一区二区三区| 久久中文字幕一区二区三区| 亚洲综合三区| 国产精品二区不卡| 中文字幕日韩欧美精品高清在线| 国产h片在线观看| 中文字幕一区二区三区四区久久| 日本在线高清| 国产精品久久乐| 视频精品一区二区| 久久久久国产精品一区二区| 久久精品国产亚洲一区二区三区| 三级在线观看一区二区| 99视频精品视频高清免费| 国产一区二区精品久| 久久av影院| 久久精品超碰| 国产日韩欧美一区二区三区 | 鲁大师精品99久久久| 日韩高清欧美激情| 日韩一区二区三区精品视频第3页| 欧美成人午夜| 欧美日韩视频一区二区三区| 精品免费av在线| 久久蜜桃精品| 1024精品久久久久久久久| 91精品国产自产在线观看永久∴| 精品一区av| 国产一区二区三区不卡视频网站| 日韩欧美高清一区二区三区| 国产二区精品| 免费日韩精品中文字幕视频在线| 国产一区91| 日韩中文字幕| 久久99蜜桃| 一区二区三区四区日本视频| 久久一区二区三区电影| 久久亚洲一区| 免费在线播放第一区高清av| 日韩中文字幕在线一区| 亚洲精品大片| 国产精品日韩精品中文字幕| 欧美亚洲专区| 精品一区二区三区的国产在线观看 | 久久精品一本| 亚洲成人av观看| 国产一级一区二区| 欧美一级网址| 在线看片福利| 涩涩涩久久久成人精品| 精品91福利视频| 婷婷中文字幕一区| 国产精品久av福利在线观看| 精品国产精品国产偷麻豆 | 亚洲欧美综合| 日韩精品亚洲专区| 美女视频黄 久久| 亚洲精品a级片| 欧美亚洲色图校园春色| 日本欧美不卡| 国产亚洲久久| 四虎4545www国产精品| 日本成人中文字幕| 樱桃视频成人在线观看| 日韩欧美激情| 麻豆视频在线看| 日韩一区二区三免费高清在线观看 | 久久精品欧洲| 亚洲影视一区二区三区| 久久夜夜操妹子| 久久一区欧美| 日韩精品欧美大片| 日韩视频二区| 99久久99视频只有精品| 电影91久久久| 久久精品资源| 国产极品模特精品一二| 中文字幕av一区二区三区人 | 亚洲丝袜啪啪| 欧美中文一区二区| 日本特黄久久久高潮| 亚洲精品在线a| 亚洲人成高清| 亚洲一区二区三区久久久| 女同性一区二区三区人了人一| 午夜精品成人av| 国产成人精品一区二区三区视频| 久久国产乱子精品免费女| 久色成人在线| 久久精品超碰| 国产精品午夜av| 国产免费av一区二区三区| 石原莉奈在线亚洲二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久高清精品| 久久高清免费| 亚洲色图网站| 欧美日韩午夜电影网| 欧美激情亚洲| 国产专区精品| 99成人在线视频| 日韩午夜免费| 国产农村妇女精品一区二区| 女人天堂亚洲aⅴ在线观看| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区有码| 97成人超碰| 国产美女精品视频免费播放软件| 欧美影院精品| 四虎成人av| 亚洲一区二区三区免费在线观看| 综合激情在线| 国产不卡精品| 亚洲欧美日韩在线观看a三区| 日韩三级精品| 欧美亚洲日本精品| 久久国产精品亚洲77777| 欧美日韩亚洲一区三区| 国产精品多人| 欧美 日韩 国产精品免费观看| 亚洲精品在线二区| av资源新版天堂在线| 欧美搞黄网站| 国产日韩中文在线中文字幕| 日韩欧美一区二区三区在线观看 | 精品国产99| 亚洲精品日本| 久久久国产亚洲精品| 国产精品亚洲综合在线观看| 国产精品毛片在线| 国产不卡av一区二区| 日韩黄色免费网站| 五月婷婷亚洲| 久久精品国产在热久久| 日本视频在线一区| 久久亚洲国产精品一区二区| 精品国产乱码| 欧美精品三级在线| 在线视频精品| 久久精品91| 日本不良网站在线观看| 精品一区二区三区免费看| 日韩国产欧美一区二区三区| 欧美成人日韩| 精品欧美激情在线观看| 久久精品一区二区不卡| 首页国产精品| 久草免费在线视频| 国产精品videossex久久发布| 日本在线观看不卡视频| 亚洲精品在线国产| 久久最新视频| 中文字幕免费一区二区| 老鸭窝毛片一区二区三区|