Java CriterialBuilder、规范和谓词。针对Oracle sql exists子句的Spring数据解决方案
我有一个类似于下面的sql。因为我不能使用生产数据库表名,而且查询非常混乱Java CriterialBuilder、规范和谓词。针对Oracle sql exists子句的Spring数据解决方案,java,oracle,jpa,spring-data,hibernate-criteria,Java,Oracle,Jpa,Spring Data,Hibernate Criteria,我有一个类似于下面的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.na
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)
但是现在这个逻辑被转移到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.isbn所在的best_sellers中选择*=
图书馆图书
实体如下:
图书馆图书
书名
作者姓名
价格
isbn
....
畅销书
名称
isbn
列特索尔德
连接不是一个选项,因为实际实体比本例中的实体复杂。因此,也不要介意不合逻辑的实体关系,因为这是一个示例。真正的问题是,当您需要使用exists合并子查询时,如何使用spring数据和条件生成器。谢谢你的帮助你能发布模型吗?@HarshalPatil,添加了实体。您可以在顶部看到第一个本机查询。我的问题是如何使用criteria builder进行子查询。子查询使用已声明的表和新表。我需要实体的关系,以便解决您的问题。没有关系。尽管如此,libraryBooks.bookName==bestSellers.name&&libraryBooks.isbn==bestSellers.isbn在某些情况下可能是正确的。因此,这里需要使用JPQL。请参考此答案。
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;
}
};
}