【发布时间】:2020-11-13 14:24:06
【问题描述】:
为了简化问题:我们有一个类/表 Wine(表“wines”),它具有以下属性:
- 名称:字符串
- 描述:字符串
- 原产地:原产地
...其中 Origin 是另一个类(带有表“origins”),只有 region: String 和 country: String。
我正在尝试在我的存储库中创建一个供 RestController 使用的搜索方法。
RestController中的方法声明是这样的:
@GetMapping("/search")
public Wine searchProduct(
@RequestParam Optional<String> searchTerm,
@RequestParam Optional<Origin> origin) {
// ???
}
我现在要做的是:为使用 searchTerm 的数据库创建一个查询,如果给定的话,与 origin 相同。它应该是可分页的。 示例:
SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id
WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)
如果没有给出搜索词,则整个“() AND”部分不应出现在查询中。如果没有给出 Origin... 你明白了。
我尝试过的事情:
-
(天真地)在我的存储库中构建一个大型查询(实现 CrudRepository),例如 here。
Page<Wine> findWinesByNameLikeOrDescriptionLikeAndOriginEquals(..., Pageable pageable);- 这(除了超级难看,尤其是对于更多属性)可能不起作用,因为:
- 未定义 OR 或 AND 更重要(无括号)。
- 不知道我是否可以将“起源”对象推入其中以使其工作。
- 不知道 Pageable 是否可以工作,如果这是一种自定义方法。
- 这(除了超级难看,尤其是对于更多属性)可能不起作用,因为:
-
按照 spring.io here 的建议使用“规范和 Querydsl”。
- 我只是愚蠢地理解这一点,尤其是在帖子底部的那些 Q 类或开头的 _ 类。它应该做的事情似乎太复杂了。
- 也没有分页选项。不过,有一个可能的修复方法,例如 here,但我没有解决,因为一开始使用这些 _ 和/或 Q 类的开销很大。
-
另外,this 只是我从 2013 年发现的一个例子,我什至不理解它,但看起来很合适。
【问题讨论】:
-
您的
Wine实体是否与Origin有@ManyToOne关系? -
stackoverflow.com/questions/48882265/… 这和你的问题有关吗
-
@KavithakaranKanapathippillai 葡萄酒和产地是 OneToOne。
-
@Justas 我所说的是一个带分页的动态查询。您提供的链接仅用于后者的实现。
标签: java sql spring spring-boot jpa