亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Springboot?JPA如何使用distinct返回對(duì)象

 更新時(shí)間:2022年02月23日 11:47:04   作者:小石潭記丶  
這篇文章主要介紹了Springboot?JPA如何使用distinct返回對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

JPA如何使用distinct返回對(duì)象

package com.frank.jpaBatchSave.repository;
import com.frank.jpaBatchSave.entity.Person;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
 
@Repository
public interface PersonRepository extends PagingAndSortingRepository<Person, Integer> {
 
    @Query("select distinct new Person(p.name, p.province, p.city) from Person p")
    List<Person> getAllPerson();
}

這里如果需要返回的是對(duì)象,則需要new Person(p.name, p.province, p.city),同時(shí)Person類必須要有三參的構(gòu)造器。

public Person(String name, String province, String city) {
? ? ? ? this.name = name;
? ? ? ? this.province = province;
? ? ? ? this.city = city;
? ? }

因?yàn)椋簊elect distinct name, province, city) from Person p 這樣寫的話返回的是Object[]數(shù)組。所以需要使用上面的方式。

JPA自定義返回對(duì)象

任何ORM框架都少不了開放自定義sql的問題。jpa自然也不例外,很多場(chǎng)景需要寫復(fù)雜sql的。

首先定義一個(gè)方法簽名,然后打上@Query注解。像下面這樣,需要注意nativeQuery,這個(gè)表示query中的字符以原始的sql語(yǔ)句執(zhí)行,也就是不做任何調(diào)整。你寫啥,就執(zhí)行啥sql語(yǔ)句。但是想返回自定義的實(shí)體,Sorry,做不到。的用另一種方式。

@Query(value = "SELECT * from table where id= :id", nativeQuery = true)
List<aa> getByaaId(@Param("id") BigInteger id);

方法一

下面這個(gè)就是實(shí)現(xiàn)自定義的實(shí)體方法。首先需要定義個(gè)實(shí)體,這個(gè)實(shí)體必須包含無參和全參構(gòu)造函數(shù)。然后去掉nativeQuery,同時(shí)還有一點(diǎn)必須注意,寫的語(yǔ)句里面不是數(shù)據(jù)庫(kù)中對(duì)應(yīng)的實(shí)際表名,而是你定義的實(shí)體映射。比如下面的table1和table2,其實(shí)都是你定義的實(shí)體類的名字,不是你的數(shù)據(jù)庫(kù)表名,是你代碼中映射數(shù)據(jù)表的實(shí)體類名。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class aaDto {
? ? private String aa;
? ? private String bb;
? ? private String cc;
}
@Query(value = "SELECT new com.xxx.xxx.dto.aaDto(i.aa,i.bb,i.cc) FROM table1 i JOIN table2 e on i.id=e.id")
List<aaDto> getList();

方法二

方法一這種寫法還是非常不靈活,有時(shí)候?qū)懸恍┖瘮?shù)什么的,估計(jì)會(huì)搞死,還是得寫原生的sql才行。我說的查詢字段屬于多個(gè)表。如果只查詢一個(gè)表字段,關(guān)聯(lián)查詢只是條件,可以直接返回對(duì)應(yīng)的實(shí)體也是沒問題的。

List<Map<String, Object>>
@Query(value = "SELECT a.aa,b.bb from a LEFT JOIN b a.id=b.id", nativeQuery = true)
List<Map<String, String>> getFundAccountList();

這樣返回的數(shù)據(jù)就是一個(gè)集合,是鍵值型的,如果我們實(shí)在想用對(duì)象,不用Map,我是先把返回參數(shù)序列化成json,然后將這個(gè)json再反序列化成我們想要的對(duì)象即可。

方法三

在繼承jpa接口的時(shí)候,里面的實(shí)體類寫你的對(duì)應(yīng)結(jié)果類,就可以用相應(yīng)的結(jié)果來接收了。

public interface xxxDTORepository extends JpaRepository<xxxDTO, Long>

方法四

以上的方法都是基于繼承JpaRepository接口來實(shí)現(xiàn),其實(shí)又另外一種更加靈活的方式,這種方式可以更加靈活的寫sql和定義返回對(duì)象。

@PersistenceContext
private EntityManager entityManager;

記錄一個(gè)錯(cuò)誤:Path expected for join!

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!

就這么個(gè)錯(cuò)誤,其實(shí)很簡(jiǎn)單,只是我沒有細(xì)看錯(cuò)誤信息,導(dǎo)致在正確的語(yǔ)句找錯(cuò)誤,找不到。出現(xiàn)這個(gè)錯(cuò)誤,后面會(huì)跟你寫的hql語(yǔ)句,注意留意這個(gè)hql語(yǔ)句,仔細(xì)檢查,他一定是有錯(cuò)誤的。

有個(gè)博客說需要添加映射關(guān)系,其實(shí)完全不用的,就是一對(duì)多,A類里面包含List<B> 是不需要這樣的,獨(dú)立類沒任何關(guān)聯(lián)也是可以的,細(xì)心細(xì)心細(xì)心。。。

順帶再來記錄一個(gè)問題吧,這個(gè)問題簡(jiǎn)單,出現(xiàn)下面這段代碼,后面會(huì)跟一些信息,根據(jù)信息就可以知道是返回對(duì)象的構(gòu)造函數(shù)類型問題,既然這樣,那就調(diào)整下返回實(shí)體對(duì)象的屬性類型即可。

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中獲取json的所有key方法

    java中獲取json的所有key方法

    下面小編就為大家分享一篇java中獲取json的所有key方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Java中該如何優(yōu)雅的使用線程池詳解

    Java中該如何優(yōu)雅的使用線程池詳解

    在java開發(fā)中我們對(duì)“池”的概念并不陌生,常見的有數(shù)據(jù)庫(kù)連接池、線程池、對(duì)象池、常量池等等,其作用基本上就是避免頻繁的創(chuàng)建和回收,造成資源浪費(fèi),線程池也不例外,這篇文章主要給大家介紹了關(guān)于Java中該如何優(yōu)雅的使用線程池的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • java使用正則表達(dá)式判斷郵箱格式是否正確的方法

    java使用正則表達(dá)式判斷郵箱格式是否正確的方法

    這篇文章主要介紹了java使用正則表達(dá)式判斷郵箱格式是否正確的方法,涉及java正則表達(dá)式及字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-07-07
  • java list去重操作實(shí)現(xiàn)方式

    java list去重操作實(shí)現(xiàn)方式

    Java中的List是可以包含重復(fù)元素的(hash code 和equals),接下來將介紹兩種方式實(shí)現(xiàn)java list去重操作,感興趣的朋友可以參考下
    2012-12-12
  • java微信支付接入流程詳解

    java微信支付接入流程詳解

    這篇文章主要為大家詳細(xì)介紹了java微信支付接入流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java使用集合實(shí)現(xiàn)通訊錄功能

    java使用集合實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了java使用集合實(shí)現(xiàn)通訊錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java簡(jiǎn)易登錄注冊(cè)小程序

    Java簡(jiǎn)易登錄注冊(cè)小程序

    這篇文章主要為大家詳細(xì)介紹了Java圖形界面開發(fā),簡(jiǎn)易登錄注冊(cè)小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 新的Java訪問mysql數(shù)據(jù)庫(kù)工具類的操作代碼

    新的Java訪問mysql數(shù)據(jù)庫(kù)工具類的操作代碼

    本文通過實(shí)例代碼給大家介紹新的Java訪問mysql數(shù)據(jù)庫(kù)工具類的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-12-12
  • 教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法

    教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著如何使用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • mybatis入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    mybatis入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了mybatis入門的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評(píng)論