使用本机查询从 Spring 数据返回自定义对象



我的问题基于另一篇文章。如何使用本机查询实现相同的目标?本机查询不允许 JPQL,因此也不允许新实例。

我的波乔。

class Coordinates {
    private final BigDecimal latitude
    private final BigDecimal longitude
    ...
}

我的数据库表包含城市周长的坐标,因此有三列:city_name、纬度、经度。每个城市都包含大量(实际上是LOTS(的周长坐标,这些坐标将用于在Google地图中构建阴影区域。

我打算在该表上构建一个简单的本机查询,该查询应返回坐标列表。

在另一篇文章中找到了答案。 基本上,我将SqlResultSetMappingConstructorResult一起使用(没有其他方法(,特别注意对上述帖子的接受答案的评论:您需要将@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 数据查询方法通常返回由存储库管理的聚合根的一个或多个实例。但是,有时可能需要基于这些类型的某些属性创建投影。Spring 数据允许对专用返回类型进行建模,以更有选择性地检索托管聚合的部分视图。

我找到的答案:

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 查询只是一个示例,您可以使用扩展 CRUD 操作(

只需将接口添加为对查询的响应

示例存储库:

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

示例接口(显示朗龙I.java(

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

在界面中,您可以选择仅要显示的参数/对象

相关内容

  • 没有找到相关文章

最新更新