Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用本机查询从Spring数据返回自定义对象_Java_Spring_Jpa_Spring Boot_Spring Data - Fatal编程技术网

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

Java 使用本机查询从Spring数据返回自定义对象,java,spring,jpa,spring-boot,spring-data,Java,Spring,Jpa,Spring Boot,Spring Data,我的问题是基于。如何使用本机查询实现相同的功能?本机查询不允许JPQL,因此也不允许新实例 我的波乔 class Coordinates { private final BigDecimal latitude private final BigDecimal longitude ... } 我的数据库表包含城市周长的坐标,所以有三列:城市名称、纬度、经度。每个城市都包含大量(实际上,大量)的周界坐标,这些坐标将用于在谷歌地图中构建阴影区域 我打算在该表上构建一个简单

我的问题是基于。如何使用本机查询实现相同的功能?本机查询不允许JPQL,因此也不允许新实例

我的波乔

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}
我的数据库表包含城市周长的坐标,所以有三列:城市名称、纬度、经度。每个城市都包含大量(实际上,大量)的周界坐标,这些坐标将用于在谷歌地图中构建阴影区域

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

您必须使用JPA的一部分。

这是并且是一个演示该问题的项目

@Query(value = "SELECT name AS name, age AS age FROM Person", nativeQuery = true)
List<PersonSummary> findAllProjectedNativeQuery();
@Query(value=“选择姓名作为姓名,年龄作为个人年龄”,nativeQuery=true)
列出findAllProjectedNativeQuery();
它在Hibernate 5.2.11附带的Spring数据JPA2.0GA(Kay)版本中得到了修复

Spring数据1.10.12(Ingalls)和1.11.8(Hopper)也解决了这个问题,但需要在Hibernate 5.2.11上运行才能正常工作。

在上找到了答案。基本上,我使用了
sqlresultsmapping
以及
ConstructorResult
(没有其他解决方法)特别注意对上述帖子的公认答案的评论:您需要将
@namednaviquiry
注释添加到所使用的
接口的实体中,并在实体名称前面加上
,否则它将不起作用

示例:

@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 {

如果您使用的是最新版本的
spring数据
,并且还使用了
存储库
,我个人认为,从中得到的答案会带来正确的解决方案

实际上,我现在还不知道(Spring数据)
投影
,需要一点时间来理解他在示例中所展示的内容

因此,我只想添加一个链接到
Spring数据JPA-参考文档
,看看

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);
}
public接口UserEventRepository扩展了JpaRepository{
列出findAllByUserId(长用户标识);
@查询(value=“从用户事件ue中选择用户id”+
“其中ue.user_id=:userId”,nativeQuery=true)
列出finduseridbyventid(@Param(“userId”)长userId);
}
这样我们就可以返回长ID列表。这里的关键是我们将nativeQuery属性设置为true。值本身就是我们想要执行的查询


我希望这有帮助。这似乎是一个明确的解决方案。

预测解决方案是最好的。(按id查询只是一个示例,您可以只使用extends CRUD操作)

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

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

public interface MyInterface () {
    String getName();
    String getLastName();
    ......
}

有趣的东西。在接受这个答案之前,我会试一试。但我想知道:如果我没有实体呢?我将无法使用
org.springframework.data.repository.*
。在这种情况下,我会说约翰塞纳的答案是正确的entity@SidneydeMoraes如果您根本没有实体,为什么还要使用spring数据存储库呢?这个查找器只能作为已经创建的Spring数据存储库的补充方法。否则,我会选择普通的jdbcTemplate+rowmapper解决方案。我想保持使用带有单个注释(如
@Query
)的接口存储库的便利性,而不必处理实体管理器的注入和所有那些东西。您链接到的票据对于版本1.10.12和1.11.8也是固定的,但给定的代码仍然不起作用..:-(根据作者的说法,你也需要Hibernate Hibernate 5.2.11或更高版本。)我发现
SqlResultsMapping
本机仅对实体有效,而对非实体POJO无效。我将尝试使用
ConstructorResult
。因此,
ConstructorResult
是一个不错的选择。请检查我添加的答案。@Manu有一段时间我这样做了,所以我真的不记得“在实体名称前面加上
”这个词了部分,但我在上面粘贴了当前正在生产的部分。Prepend实体名称部分澄清了这一点,因为它很重要。如果您的nativequery名称为obterPerimetrodAssetores,并且实体名称为GrupoCensitario,那么您需要在@NamedNativeRequesty中将其命名为GrupoCensitario.obterPerimetrodAssetores,以便Spring能够从回复:obterPerimetroDosSetores查询属于GrupoSensario类。希望有帮助。这是一个好问题。请参考我在《这是否回答了你的问题?@Lu55》中的回答。这个问题自2017年以来已经有了答案。我感谢你的贡献,但这个问题已经有了公认的答案。此外,这个问题与返回cu有关stom值对象而不是实体,这是spring数据存储库的常规用法。@reneta本机查询速度快吗?@KumaresanPerumal-我不确定,我不认为有速度差异-本机查询通常在需要进行更复杂的查询或不寻常的查询时使用。已经给出了相同的答案。