为了简化这个问题,我们有一个类/餐桌酒(餐桌“wines”),除其他属性外,它具有:
我试图在我的存储库中创建一个搜索方法,以供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*/)
page
使用spring.io建议的“specifications and queryDSL”。
如果您发现很难理解规范
,只有这两个搜索参数,并且假设win
实体具有@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));
QueryDSL定义了一个接口,通过调用或可以轻松地为任何字段获取该接口的实例。Spring Data JPA的接口甚至有一个方法,它将作为参数。 但是对QueryDSL一无所知,它有自己定义查询排序顺序的方法,即。它可以包含许多,它们与非常相似,只是它们不是类型安全的。 所以,如果我想做使用排序的分页查询,真的没有办法使用QueryDSL来定义它吗?
我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM
在我的情况下,我有一个审查实体,它由审查状态和提交日期组成。 我正在尝试使用JpaRepository,但我不确定如何使用它来支持以下搜索查询。 我可以看到(参考http://docs.spring.io/spring-data/jpa/docs/1.4.3.release/reference/html/jpa.repositories.html),我们可以为特定的查询定义方法,比如FindByN
我有两个多对多映射的类:用户和主题。我想做的是得到所有的主题谁有提供的用户。有时(这是我最奇怪的部分)它会给我带来这样的错误: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,以便在第1行'))'附近使用正确的语法 返回的查询是: 我在这里漏掉了什么?完整的
由于JPA不接受JOIN中的子查询,我们必须以nativeQuery的形式进行,但是这样做时,我们在分页方面遇到了问题,因为JPA没有将其与本地查询结合起来。https://docs.spring.io/spring-data/jpa/docs/1.8.0.m1/reference/html/ 本机查询@query注释允许通过将nativeQuery标志设置为true来执行本机查询。请注意,我们目
Spring官方JPA规范文档 我对非常陌生,所以任何指导都很有价值。