繁体   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