首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当属性来自另一个表时,如何避免在Spring Data JPA上指定SQL查询

当属性来自另一个表时,如何避免在Spring Data JPA上指定SQL查询
EN

Stack Overflow用户
提问于 2018-06-09 04:49:20
回答 3查看 189关注 0票数 0

我正在使用Spring Data JPA,我有以下实体:国家:{country_id,country_name}地区:{region_id,region_name,country_id}

从一个国家到另一个地区,有许多关系。

我有一个针对Country的JpaRepository,我有一个类似以下的方法:

代码语言:javascript
运行
复制
@Query("SELECT new org.example.CountryDTO(a.countryId, a.countryName, b.regionName ) FROM Country AS a left join Region AS lpd on a. countryId = r. countryId  WHERE a. countryId = LOWER(:country) and r.regionName= LOWER(:region) ”)
List<CountryDTO> find(@Param("country") String country, @Param("region") String region);

问题是,有什么方法可以避免指定SQL查询吗?理想情况下,我希望这样做:

代码语言:javascript
运行
复制
List<CountryDTO> findByCountryAndRegionName(@Param("country") String country, @Param("region") String region);

但是,这看起来有点复杂,因为region_name列来自Region表。

有没有人做过这样的事?您可能会提出任何优雅的解决方案吗?

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

发布于 2018-06-09 05:33:32

根据文档,您可以通过遍历嵌套属性来定义约束。请参阅2.4.3 Property Expressions

假设Country有一个属性regions,并且Country和Region都有name属性,您可以这样写:List<Country> findByNameAndRegions_Name(String countryName, String regionName)

票数 1
EN

Stack Overflow用户

发布于 2018-06-09 19:48:11

我认为这应该行得通:

代码语言:javascript
运行
复制
interface CountryProjection {
  String getCountryId();
  String getCountryName()
  String getRegionName()
}

然后,您的查询方法可以如下所示:

代码语言:javascript
运行
复制
List<CountryProjection> findByCountryNameAndRegionRegionNameAllIgnoreCase(String country,String region);

您必须使用Spring Data JPA 1.10 a以后才能在查询方法中提供投影支持。

票数 1
EN

Stack Overflow用户

发布于 2018-06-09 13:51:06

按照建议的here,如果使用原生查询,看起来可以返回List<Object[]>

虽然我更喜欢创建一个单独的DTO,因为这是一个不同的投影。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档