Java for Web学习笔记(一一九):搜索(1)JPA的动态条件搜索(上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flowingflying/article/details/79944801

关于搜索

数据库中的index

需要平衡考虑:

  • 索引会使查询更快
  • 索引会使持续化更慢

这需要我们具体个例具体衡量。

  • 一般来讲95%的请求都应还有index,多个条件的请求,必须有一个带有index。
  • LIKE的比对中不应将通配符方在前面,这会引发全局扫描,如果非要这样,应必须带有其他index的条件。
  • OR的效率没有AND的高
  • 待用index的条件应该放置在前面
  • 唯一约束提供检索效率,UNIQUE KEY不仅仅是确保唯一,还可以有效提供定位记录。

学习三种检索方式

是否使用索引和使用多少索引,取决于数据读写的比例。我们将学习下面三种检索方式:

  1. 复杂查询中使用简单索引:基于动态查询(用户可能选择某几项,各项之间可能是AND关系也可能是OR的关系,指定的排序),最好的方式是采用criteria API
  2. 使用数据库厂商索引的全文本搜索
  3. 使用Apache Lucene和Hibernate Search的全文本搜索

Criteria JPA的动态搜索小例子


这是原来的标准JPA接口的代码例子:

public Book getByIsbn(String isbn){
    CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
    CriteriaQuery<Book> query = builder.createQuery(this.entityClass);
    Root<Book> root = query.from(this.entityClass);
    return this.entityManager.createQuery( query.select(root)
                         //【注意】where本身是可以带多个条件的:CriteriaQuery.where(Predicate... restrictions)
                         .where(builder.equal(root.get("isbn"), isbn)))
                         .getSingleResult();
}

我们需要做的是:

  1. 利用CriteriaQuery.where(Predicate... restrictions)带入我们的动态查询的多个条件
  2. 提供一个通用的动态查询方法,而不是指定具体类型,如Book或者Person。

相关链接:我的Professional Java for Web Applications相关文章


阅读更多

没有更多推荐了,返回首页