使用Spring Data Jpa遇到問題彙總

使用Spring Data Jpa遇到問題彙總


用於記錄我在使用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來分頁查詢
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章