我有一个类似于以下的sql。 (因为我不能使用生产数据库表名并且查询非常混乱)
select book_name, auther_name, price
from library_books
where book_name=?1, auther_name = ?2, price < ?3
and exists (select * from best_sellers where best_sellers.isbn = library_books.isbn
and best_sellers.name = library_books.book_name)
这实际上是用于过滤报告的查询。例如,如果屏幕获得书籍列表,则用户可以搜索所有书籍或基于标准过滤搜索。在现有代码中,查询连接如下
if (StrinUtils.isNotEmpty(search_name)){
sb.append ("book name like '%"+search_name+"'%");
}
但现在将此逻辑转移到spring数据以使用规范和条件构建器。
public Specification<T> getQuerySpecification(final SearchForm searchForm) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> recordsRoot, CriteriaQuery<?> query,
criteriaBuilder cb) {
Predicate predicate = cb.conjunction();
if (StringUtils.isNotEmpty(searchForm.getName)){
predicate.getExpressions().add (cb.equal(cb.lower(recordsRoot.get("bookName").as(String.class)), searchForm.getName.toLowerCase(Locale.ENGLISH)) );
}
return predicate;
}
};
}
我的问题是,如何使用spring数据管理原始查询中的以下部分。请注意,它还涉及一个不同的表调用best_sellers
并存在(从best_sellers中选择*,其中best_sellers.isbn = library_books.isbn)
实体将如下
LibraryBooks
Best_Sellers
Join不是一个选项,因为实际实体比本例中的实体复杂。因此,也不要介意不合逻辑的实体关系,因为这是一个样本。真正的问题是当您需要使用“exists”合并子查询时如何使用spring数据和条件构建器。谢谢你的帮助