Java 使用本机查询从Spring数据返回自定义对象
我的问题是基于。如何使用本机查询实现相同的功能?本机查询不允许JPQL,因此也不允许新实例 我的波乔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 ... } 我的数据库表包含城市周长的坐标,所以有三列:城市名称、纬度、经度。每个城市都包含大量(实际上,大量)的周界坐标,这些坐标将用于在谷歌地图中构建阴影区域 我打算在该表上构建一个简单
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-我不确定,我不认为有速度差异-本机查询通常在需要进行更复杂的查询或不寻常的查询时使用。已经给出了相同的答案。