使用Spring Data Jpa遇到問題彙總
用于記錄我在使用spring data jpa時遇到的各種問題及其解決方案
- 使用Spring Data Jpa遇到問題彙總
- 自定義查詢語句(@Query 與 nativeQuery)
- 傳回自定義查詢對象(如”select new Map(xx,xx,xx)”)
- 字段映射相關問題
- 字段命名解析
- 字段類型解析
- @Transient
- 分頁
自定義查詢語句(@Query 與 nativeQuery)
隻需要在方法上加上注解@Query即可,預設使用HQL如下:
NetworkInfo是對應的實體類
@Query("SELECT count(n.network) FROM NetworkInfo n where network=?1")
Long countDeviceNumByNetwork(String network);
如需要使用資料庫的SQL語句,則需要在@Query注解内加上 nativeQuery=true如 @Query(value=”xxx”,nativeQuery=true)
如下:
@Query(value = "SELECT network_type,count(network_type) as count FROM network_manage WHERE network = ?1 " +
"and TIMESTAMPDIFF(YEAR,(CASE WHEN DATE(in_net_date) is NULL THEN " +
"CONCAT(in_net_date,'/01/01') ELSE in_net_date END),NOW())>=?2 GROUP BY network_type", nativeQuery = true)
List<Object[]> countDeviceNumInNetDateMoreThanYEARSIntGroupByNetworkType(String network, int years);
傳回自定義查詢對象(如”select new Map(xx,xx,xx)”)
可以在注解裡使用HQL來傳回自定義對象 例子如: @Query(“select new XXX(XX)”)
預設傳回的Map是以序号為key(如0,1,2)
樣例:
@Query("SELECT new Map(manufacturer,networkType,count(manufacturer)) FROM NetworkInfo WHERE network = ?1 " +
"GROUP BY manufacturer,networkType")
List<Map<String, Object>> countDeviceNumGroupByManufacturerAndNetworkType(String network);
若是使用nativeQuery預設傳回一條記錄為Object[] 樣例見上面自定義查詢語句
字段映射相關問題
字段命名解析
我使用spring boot + spring data jpa時,預設的表名映射規則是遇到大寫(比如aAaAa),則将大寫字母替換為下劃線+小寫字母(a_aa_aa).
一般JAVA中的變量命名規範都符合駝峰式,此時資料庫遇到一個字段”portDesc”,而我的實體類的變量名也為portDesc,此時就會将這個portDesc解析為”port_desc”然後就會報錯.
我查了兩種解決方法
1.最友善的解決方案是給字段加上@Column(name=”portdesc”) (前提是你的資料庫大小寫不敏感?)
2.還有更改解析政策的方式(spring boot配置):
但是使用了這種方式會讓預設的駝峰解析成下劃線的規則失效.
字段類型解析
使用映射時,我遇到了text,longtext,set等字段類型,使用預設的映射規則時報了錯,無法直接使用String擷取.
解決方案@Column(columnDefinition=”XXX”).
@Transient
當我們在實體類中加上一個不與資料庫表一一對應的成員變量的時候,此時我們隻要在這個成員變量上加上注解@Transient
分頁
通過Pageable來分頁查詢
https://blog.csdn.net/u011848397/article/details/52151673
多種方法實作分頁(包括HQL或本地sql)
https://www.cnblogs.com/hdwang/p/7843405.html
Spring Data JPA: 分頁和排序
https://blog.csdn.net/u011848397/article/details/52151673