我正在使用Spring Boot和QueryDSL进行REST请求,但是在执行搜索时却遇到问题,该搜索执行两个字段中具有相同值的查询(以澄清一个值是否在一个字段中或另一个字段中) 。像这样:
select * from news where title like '%word%' or content like '%word%';
我想发出这样的请求(严格来说,可能有所不同)
http://localhost?title=word&content=word
我的RestController中有这个
@GetMapping
public PagedResources<Resource> get(@QuerydslPredicate(root = News.class) Predicate predicate,
@SortDefaults({
@SortDefault(sort = "type", direction = ASC),
@SortDefault(sort = "dateCreated", direction = DESC)
}) Pageable pageable) {
Page<News> pages = newsService.getAllWithPagination(predicate, pageable);
return pagedResourcesAssembler.toResource(pages, newsResourceAssembler);
}
这是我的存储库:
public interface NewsRepository extends JpaRepository<News, Long>, QuerydslPredicateExecutor<News>, QuerydslBinderCustomizer<QNews> {
@Override
default void customize(QuerydslBindings bindings, QNews news) {
bindings.bind(String.class)
.first((SingleValueBinding<StringPath, String>) StringExpression::containsIgnoreCase);
}
}
我已经厌倦了搜索,没有找到做过类似事情的人。有人对如何执行此操作有任何建议吗?
答案 0 :(得分:2)
QNews qnews = QNews.news;
final BooleanExpression booleanExpression = qnews.title.like(“%word%”)。or(qnews .content.like(“%word%”));
就在此之前检查queryparam中的空值
答案 1 :(得分:0)
有了@kumar答案和更多的研究,我终于实现了我想要的:
@Override
default void customize(QuerydslBindings bindings, QNews news) {
bindings.bind(news.title)
.first((path, value) -> path.likeIgnoreCase("%" + value + "%").or(news.content.likeIgnoreCase("%" + value + "%")));
}