CriterialBuilder,规范和谓词。适用于Oracle sql的Spring Data解决方案存在子句

时间:2014-10-09 08:42:57

标签: 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.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

  • BOOKNAME
  • AUTHORNAME
  • ISBN
  • ....

Best_Sellers

  • 姓名
  • ISBN
  • printsSold

Join不是一个选项,因为实际实体比本例中的实体复杂。因此,也不要介意不合逻辑的实体关系,因为这是一个样本。真正的问题是当您需要使用“exists”合并子查询时如何使用spring数据和条件构建器。谢谢你的帮助

0 个答案:

没有答案