簡體   English   中英

使用本機查詢從 Spring 數據返回自定義 object

[英]Return custom object from Spring Data with Native Query

我的問題是基於另一篇文章 如何使用本機查詢實現相同的目的? 本機查詢不允許 JPQL,因此也不允許新實例。

我的波喬。

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}

我的數據庫表包含城市周邊的坐標,因此有三列:city_name、latitude、longitude。 每個城市都包含很多(實際上,很多)周界坐標,這些坐標將用於在 Google 地圖中構建陰影區域。

我打算在該表上構建一個簡單的本機查詢,該查詢應返回一個坐標列表。

另一篇文章中找到了答案。 基本上我用SqlResultSetMapping沿ConstructorResult (沒有其他辦法解決)有特別注意上提后的接受的答案評論:您需要將添加@NamedNativeQuery注解所使用的實體interface 在前面加上實體的名稱用一個. 否則它將無法工作。

例:

@Entity
@Table(name = "grupo_setorial")
@SqlResultSetMapping(
        name = "mapeamentoDeQuadrantes",
        classes = {
                @ConstructorResult(
                        targetClass = Coordenada.class,
                        columns = {
                                @ColumnResult(name = "latitude"),
                                @ColumnResult(name = "longitude")
                        }
                )
        }
)
@NamedNativeQuery(
        name = "GrupoCensitario.obterPerimetroDosSetores",
        query = "SELECT latitude as latitude, longitude as longitude FROM coordenadas where id_setor IN (:setores)",
        resultSetMapping = "mapeamentoDeQuadrantes"
)
public class GrupoCensitario {

這是https://jira.spring.io/browse/DATAJPA-980是一個演示該問題的項目。

@Query(value = "SELECT name AS name, age AS age FROM Person", nativeQuery = true)
List<PersonSummary> findAllProjectedNativeQuery();

它是在Hibernate 5.2.11附帶的Spring Data JPA 2.0 GA(Kay)版本中修復的。

對於Spring Data 1.10.12(Ingalls)和1.11.8(Hopper),問題也是固定的,但需要在Hibernate 5.2.11上運行才能工作。

您將不得不使用sql結果集映射 ,它是JPA的一部分。

如果您使用的是最新版本的spring-data並且還使用了Repositories ,我個人認為來自Itsallas的答案可以找到正確的解決方案。

我實際上現在還沒有關於(Spring Data) Projections ,並且需要一點時間來理解他在他的例子中展示的內容。

因此,我只想添加一個指向Spring Data JPA - Reference Documentation的鏈接Spring Data JPA - Reference Documentation ,看一下Projections章節

Spring Data查詢方法通常返回由存儲庫管理的聚合根的一個或多個實例。 但是,有時可能需要根據這些類型的某些屬性創建投影。 Spring Data允許建模專用返回類型,以更有選擇地檢索托管聚合的部分視圖。

我找到了答案:

public interface UserEventRepository extends JpaRepository<UserEvent, Long> {

    List<UserEvent> findAllByUserId(Long userId);

    @Query(value = "SELECT user_id FROM user_event ue " +
                   "WHERE ue.user_id = :userId", nativeQuery = true)
    List<Long> findUserIdByEventId(@Param("userId") Long userId);
}

這樣我們返回列表的長列表ID。 這里的關鍵是我們將nativeQuery屬性設置為true。 值本身就是我們想要執行的查詢。

我希望有所幫助。 這似乎是一個明確的解決方

預測解決方案是最好的。 (通過id查詢只是一個例子,你可以直接使用extends CRUD操作)

只需添加接口作為對查詢的響應

示例存儲庫:

@Query(select * from tableA where tableA = :id)
DisplayLangLongI findTableAbyId(@Param(value = "id") Long id)

示例接口 (DisplayLangLongI.java)

public interface DisplayLangLongI () {
        BigDecimal getLatitude();
        BigDecimal getLongitude();
        ...... (you can add more)
    }

在界面中,您可以 select 顯示哪個參數/對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM