使用Criteria进行分组求和、排序、模糊查询的实例

目录
  • Criteria进行分组求和、排序、模糊查询
    • 1.Entity如下
    • 2.repository如下
    • 3.service如下
    • 4.顺便提及一个不经意间的小错误
  • Criteria进行模糊查询实现站内搜索功能
    • Dao层的方法如下

Criteria进行分组求和、排序、模糊查询

工程框架使用的是spring data,但是spring data 提供的 JpaRepository 以及覆写JpaSpecificationExecutor接口并不能满足我的要求,我要进行模糊查询,并根据bookId对数量进行分组聚合,并获取数量最高的top n,由于模糊查询并不是必填条件,所以直接使用@Query注解感觉也不是很合适,于是采用Criteria来实现。

1.Entity如下

package com.example.springdatatest.repository.entity; 
import lombok.Data; 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Table
@Data
@Entity
public class TestEntity {
 
    @Id
    String testId;
 
    @Column
    public String regionCode;
 
    @Column
    public long count;
 
    @Column
    public String bookId; 
 
    @Column
    public String libraryCode;
}

2.repository如下

package com.example.springdatatest.repository; 
import com.example.springdatatest.repository.entity.TestEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 
public interface TestRepository extends JpaRepository<TestEntity,String>,JpaSpecificationExecutor {
}

3.service如下

package com.example.springdatatest.service; 
import com.example.springdatatest.repository.TestRepository;
import com.example.springdatatest.repository.entity.TestEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Tuple;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;
 
@Service
public class TestService {
 
    @Autowired
    TestRepository testRepository;
 
    @Autowired
    @PersistenceContext
    private EntityManager entityManager; 
 
    public void test(){
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createQuery(Tuple.class  ); 
        Root root = criteriaQuery.from(TestEntity.class);
 
        List<Predicate> predicateList = new ArrayList<>();
        predicateList.add(criteriaBuilder.equal( root.get("libraryCode" ), "1" ));
        predicateList.add(criteriaBuilder.like(root.get("regionCode"),"%"+"6101"+"%"));
        Predicate[] p = new Predicate[predicateList.size()];
        predicateList.toArray(p);
 
        Path bookId = root.get("bookId");
        Path bookCount = root.get("count"); 
        criteriaQuery.where(p)
                .multiselect(bookId,criteriaBuilder.sum(bookCount))
                .groupBy(bookId)
                .orderBy(criteriaBuilder.desc(criteriaBuilder.sum(bookCount)));
 
        List<Tuple> list = entityManager.createQuery(criteriaQuery).setFirstResult(1)
                .setMaxResults(1)
                .getResultList(); 
    }
}

4.顺便提及一个不经意间的小错误

也是由于粗心,没有写这一句  predicateList.toArray(p); ,导致一直报空指针异常。

java.lang.NullPointerException
    at org.hibernate.query.criteria.internal.predicate.CompoundPredicate.render(CompoundPredicate.java:166)
    at org.hibernate.query.criteria.internal.predicate.CompoundPredicate.render(CompoundPredicate.java:115)
    at org.hibernate.query.criteria.internal.predicate.CompoundPredicate.render(CompoundPredicate.java:105)
    at org.hibernate.query.criteria.internal.QueryStructure.render(QueryStructure.java:248)
    at org.hibernate.query.criteria.internal.CriteriaQueryImpl.interpret(CriteriaQueryImpl.java:292)
    at org.hibernate.query.criteria.internal.compile.CriteriaCompiler.compile(CriteriaCompiler.java:149)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:3707)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:208)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350)
    at com.sun.proxy.$Proxy81.createQuery(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:309)
    at com.sun.proxy.$Proxy81.createQuery(Unknown Source)
    at com.example.springdatatest.service.TestService.test(TestService.java:50)
    at com.example.springdatatest.SpringdatatestApplicationTests.contextLoads(SpringdatatestApplicationTests.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

这只是实现的一个小demo,具体入参并没有体现,在此做一个记录。

Criteria进行模糊查询实现站内搜索功能

今天给网站新加入了一个站内搜索的功能,思想是:使用Criteria进行模糊查询。

Dao层的方法如下

//搜索方法
public List<Question> findSearch(String scon) {
        Session s =  getHibernateTemplate().getSessionFactory().openSession();
        Criteria criteria =s.createCriteria(Question.class);
        criteria.add(Expression.or(Expression.like("qdesc","%"+scon+"%"),Expression.like("qname","%"+scon+"%")));
        return criteria.list();
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈DetachedCriteria和Criteria的使用方法(必看)

    在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询. 比如,我记得在Facebook中可以选择高级查询条件,这个就是个动态的查询了塞,我们无法预知使用多少个查询,直接书写死了在我们的Dao层显然是不服和我们的意思的塞 针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句.这里的一个难点是条件列表用什么来构造?传统上使用Map

  • Java操作mongodb的模糊查询和精确查询

    本意是想查查mongo数据库的int类型的like怎么查,但是好像没 解决这个问题. 精确查询:模糊查询:分页查询,每页多少:按某个字段排序(或升或降):查询数量:大于,小于,等于:且,或,某个字段不为空,某个字段不存在,查询在某个范围内,删除等等查询. 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(

  • 使用JPA进行CriteriaQuery进行查询的注意事项

    目录 使用JPA CriteriaQuery查询的注意事项 1.pojo类 service层 查询方法 封装JPA动态查询(CriteriaQuery) EntityManager管理器,通过spring管理 Page分页和结果封装类 IBaseDao接口实现了BaseDaoImpl IBaseDao接口 使用JPA CriteriaQuery查询的注意事项 1.pojo类 @Entity @Table(name = "report_workload") @JsonIgnoreProp

  • 使用Criteria进行分组求和、排序、模糊查询的实例

    目录 Criteria进行分组求和.排序.模糊查询 1.Entity如下 2.repository如下 3.service如下 4.顺便提及一个不经意间的小错误 Criteria进行模糊查询实现站内搜索功能 Dao层的方法如下 Criteria进行分组求和.排序.模糊查询 工程框架使用的是spring data,但是spring data 提供的 JpaRepository 以及覆写JpaSpecificationExecutor接口并不能满足我的要求,我要进行模糊查询,并根据bookId对数量

  • PHP模糊查询技术实例分析【附源码下载】

    本文实例讲述了PHP模糊查询技术.分享给大家供大家参考,具体如下: 简介 从本质上揭密PHP模糊查询技术 功能 根据输入的关键字查找相关用户 PHP用户查询器案例分析 课程目标 掌握PHP模糊技术的应用 课程重点 PHP模糊查询的语法 PHP模糊查询的应用 课程案例(效果图) 数据库设计 用户表(user): CREATE TABLE user( `uid` int(10) AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID', `username` varchar

  • Java递归模糊查询文件实例代码

    目录 前言 Java递归模糊查询文件 总结 前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现. Java递归模糊查询文件 字符串模糊查询 /** * 模糊查询 * @param str 需要查询的字符串 * @param part 部分 * @return true 代表查到的 false

  • AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)

    注:添加球员的功能无指定技术要求,添加球员的页面也无具体样式要求. 1.实现上图页面所有元素,页面布局规整,跟上图效果一致 2.实现文案显示,按效果显示 3.实现查询,实现查询敏感词过滤,实现查询后列表变化 4.实现倒序,实现正序,下拉列表排序效果都实现 5.按钮背景一致,按钮样式 6.实现添加球员页面,添加球员页面样式,添加球员功能,添加球员必填项判断,添加完球员后能显示在表格内,已存在球员判重. 7.表格样式跟上图样式一致 代码: <!DOCTYPE html> <html lang

  • Angular实现的自定义模糊查询、排序及三角箭头标注功能示例

    本文实例讲述了Angular实现的自定义模糊查询.排序及三角箭头标注功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net Angular模糊查询.排序</title> <style> *{ marg

  • Angular实现的内置过滤器orderBy排序与模糊查询功能示例

    本文实例讲述了Angular实现的内置过滤器orderBy排序与模糊查询功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net Angular模糊查询.排序</title> <style> *{ ma

  • java8 stream自定义分组求和并排序的实现

    本文主要介绍了java8 stream自定义分组求和并排序的实现,分享给大家,具体如下: public static void main(String[] args) { List<GroupDetailDTO> list = new ArrayList<>(); GroupDetailDTO dto1 = new GroupDetailDTO(); dto1.setHeadsetId(1); dto1.setTime("2020-01-03"); dto1.s

  • mybatis Example Criteria like 模糊查询问题

    目录 简介 Criteria类 简单实例 生成简单的WHERE子句 复杂查询 模糊查询实战 总结 用Mybatis代码生成工具会产生很多个XXXExample类,这些类的作用是什么? 查阅了很多资料,在这里总结归纳一下 简介 XXXExample类用于构造复杂的筛选条件 它包含一个名为Criteria的内部静态类,它包含将在where子句中一起结合的条件列表. Criteria类的集合允许您生成几乎无限类型的where子句. 可以使用createCriteria方法或or方法创建Criteria

  • Pandas 模糊查询与替换的操作

    主要用到的工具:Pandas .fuzzywuzzy Pandas:是基于numpy的一种工具,专门为分析大量数据而生,它包含大量的处理数据的函数和方法, 以下为pandas中文API: 缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 s:任意的Pandas Series对象 同时我们需要做如下的引入: import pandas as pd import numpy as np 导入数据 pd.read_csv(filename):从CSV

随机推荐