Java CriterialBuilder、规范和谓词。针对Oracle sql exists子句的Spring数据解决方案

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

我有一个类似于下面的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)
但是现在这个逻辑被转移到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;
                }
            };
        }