为了过度简化问题:我们有一个类/表 Wine(表“葡萄酒”),其中包括以下属性:
...其中 Origin 是另一个类(带有表“origins”),只有
region: String
和 country: String
.我正在尝试在我的存储库中创建一个供 RestController 使用的搜索方法。
RestController 中的方法声明是这样的:
@GetMapping("/search")
public Wine searchProduct(
@RequestParam Optional<String> searchTerm,
@RequestParam Optional<Origin> origin) {
// ???
}
我现在要做的是:为使用 searchTerm 的数据库创建一个查询(如果给定),与原点相同。它应该是可分页的。例子:
SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id
WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)
如果未给出搜索词,则整个“() AND”部分不应出现在查询中。如果没有给出起源......你会得到它。我尝试过的事情:
Page<Wine> findWinesByNameLikeOrDescriptionLikeAndOriginEquals(..., Pageable pageable);
最佳答案
如果您觉得难以理解 Specifications
,只有这两个搜索参数并假设 Wine
实体有一个 @ManyToOne
至 Origin
,您可以执行以下操作:
@Query("SELECT w FROM wines w join w.origin o where " +
"( :searchTerm is null or " +
" w.name like CONCAT('%',:searchTerm ,'%') or " +
" w.description like CONCAT('%', :searchTerm ,'%')" +
") " +
"AND (:origin is null or o = :origin)")
Page<Wine> searchWines(String searchTerm, Origin origin, Pageable p);
当你打电话时, wineRepository.searchWines(searchTerm.orElse(null), origin.orElse(null));
关于java - 如何使用分页进行动态 Spring (Boot) JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63061380/