使用Spring Data Jpa遇到問題彙總

江協偉發表於2019-04-20

用於記錄我在使用spring data jpa時遇到的各種問題及其解決方案

自定義查詢語句(@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配置):

spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
複製程式碼

但是使用了這種方式會讓預設的駝峰解析成下劃線的規則失效.

欄位型別解析

使用對映時,我遇到了text,longtext,set等欄位型別,使用預設的對映規則時報了錯,無法直接使用String獲取. 解決方案@Column(columnDefinition="XXX").

@Transient

當我們在實體類中加上一個不與資料庫表一一對應的成員變數的時候,此時我們只要在這個成員變數上加上註解@Transient

分頁

通過Pageable來分頁查詢 blog.csdn.net/u011848397/…
多種方法實現分頁(包括HQL或本地sql) www.cnblogs.com/hdwang/p/78…
Spring Data JPA: 分頁和排序 blog.csdn.net/u011848397/…

相關文章