首页 > 其他分享 >jpa实现查询

jpa实现查询

时间:2023-10-25 12:44:50浏览次数:31  
标签:qProjectEntity jpa List qLogEntity 查询 实现 import jpaQueryFactory

jpa实现查询

一、通过Specification查询

import com.google.common.collect.Lists;
import com.meritdata.cloud.dao.SyslogRepository;
import com.meritdata.cloud.entity.LogEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
import java.util.Date;
import java.util.List;
/**
 * @author dxj
 * @since 2022-12-10 16:07
 */
@Service
public class DongService {
    @Autowired
    private SyslogRepository syslogRepository;
    public Page<LogEntity> pageList(LogEntity logEntity, Date startDate, Date endDate,List<String> idList) {
        // 分页排序
        Pageable pageable = PageRequest.of(1, 10, Sort.by(Sort.Direction.DESC, "operateTime"));
        Specification<LogEntity> spe = (Specification<LogEntity>) (root, query, criteriaBuilder) -> {
            List<Predicate> predicates = Lists.newArrayList();
            // 精确查询
            predicates.add(criteriaBuilder.equal(root.get("id"), logEntity.getId()));
            // 模糊查询
            predicates.add(criteriaBuilder.like(root.get("user_name"), "%" + logEntity.getUsername() + "%"));
            // in条件查询
            Expression<String> exp = root.<String>get("departmentId");
            predicates.add(exp.in(idList));
            // 开始时间
            predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("operate_time"), startDate));
            // 结束时间
            predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("operate_time"), endDate));
            return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
        };
        Page<LogEntity> list = syslogRepository.findAll(spe, pageable);
        return list;
    }
}

二、通过JPAQueryFactory实现查询

import com.meritdata.cloud.entity.*;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
 * @author dongxiajun
 * @since 2022-12-15 15:30
 */
@Service
public class Dong1Service {
    @Autowired
    private JPAQueryFactory jpaQueryFactory;
    public List<ProjectEntity> getProjects(List<String> ids, String proName, String type, int pageNum, int pageSize) {
        QProjectEntity qProjectEntity = QProjectEntity.projectEntity;
        Predicate predicate1 = qProjectEntity.isNotNull().or(qProjectEntity.isNull());
        QLogEntity qLogEntity = QLogEntity.logEntity;
        Predicate predicate2 = qLogEntity.isNotNull().or(qLogEntity.isNull());
        // in 条件
        if (!CollectionUtils.isEmpty(ids)) {
            predicate1 = ExpressionUtils.and(predicate1, qProjectEntity.id.in(ids));
        }
        // 模糊
        if (StringUtils.isNotEmpty(proName)) {
            predicate1 = ExpressionUtils.and(predicate1, qProjectEntity.id.like("%" + proName + "%"));
        }
        // 相等
        if (StringUtils.isNotEmpty(proName)) {
            predicate2 = ExpressionUtils.and(predicate2, qLogEntity.type.eq(type));
        }
        // 不带条件 如果是单表查询
        List<ProjectEntity> projectEntities = jpaQueryFactory.select(qProjectEntity).from(qProjectEntity).fetch();
        // 带条件 如果是单表查询
        List<ProjectEntity> projectEntities1 = jpaQueryFactory.select(qProjectEntity)
                .from(qProjectEntity)
                .where(predicate1).fetch();
        // 查询 单表中的某个字段
        List<String> projectNames = jpaQueryFactory.select(qProjectEntity.name).from(qProjectEntity).fetch();
        // 多表联合查询(根据类型、时间对列表进行排序)
        List<ProLogEntity> proLogs = jpaQueryFactory.select(Projections.bean(ProLogEntity.class,
                qProjectEntity.name, qProjectEntity.type, qLogEntity.operation, qLogEntity.message))
                .from(qProjectEntity)
                .leftJoin(qLogEntity)
                .on(qProjectEntity.type.eq(qLogEntity.type))
                .where(predicate1, predicate2)
                .orderBy(qLogEntity.type.asc(), qLogEntity.time.asc())
                .fetch();
        // 实现分页
        int start = (pageNum - 1) * pageSize;
        JPAQuery<ProjectEntity> jpaQuery = jpaQueryFactory.select(qProjectEntity).from(qProjectEntity);
        List<ProjectEntity> result = jpaQuery.offset(start).limit(pageSize).fetch();
        // 总条数
        long count = jpaQuery.fetchCount();
        return null;
    }
}

JPAQueryFactory实现查询,功能分解

1、无条件,单表查询
List<ProjectEntity> projectEntities = jpaQueryFactory.select(qProjectEntity).from(qProjectEntity).fetch();
2、 有条件,单表查询
List<ProjectEntity> projectEntities1 = jpaQueryFactory.select(qProjectEntity)
                .from(qProjectEntity)
                .where(predicate1).fetch();
  • 1
  • 2
  • 3
3、排序
List<ProjectEntity> projectEntities1 = jpaQueryFactory.select(qProjectEntity)
                .from(qProjectEntity)
                .where(predicate1)
                .orderBy(qProjectEntity.type.asc(), qProjectEntity.time.asc())
                .fetch();
  • 1
  • 2
  • 3
  • 4
  • 5

上面的排序规则,先按照类型排序,再按照时间排序

4、查询单表中某个字段的值
List<String> projectNames = jpaQueryFactory.select(qProjectEntity.name).from(qProjectEntity).fetch();
  • 1
5、多表联合查询
List<ProLogEntity> proLogs = jpaQueryFactory.select(Projections.bean(ProLogEntity.class,
                qProjectEntity.name, qProjectEntity.type, qLogEntity.operation, qLogEntity.message))
                .from(qProjectEntity)
                .leftJoin(qLogEntity)
                .on(qProjectEntity.type.eq(qLogEntity.type))
                .where(predicate1, predicate2)
                .orderBy(qLogEntity.type.asc(), qLogEntity.time.asc())
                .fetch();

这里需要注意Projections.bean()里面的东西,ProLogEntity.class是要输出的对象;后面的值是要输出的参数

6、分页
 int start = (pageNum - 1) * pageSize;
 JPAQuery<ProjectEntity> jpaQuery = jpaQueryFactory.select(qProjectEntity).from(qProjectEntity);
 List<ProjectEntity> result = jpaQuery.offset(start).limit(pageSize).fetch();

offset是偏移量,limit是单页查询数量

原文链接:https://blog.csdn.net/dxjren/article/details/128266570

标签:qProjectEntity,jpa,List,qLogEntity,查询,实现,import,jpaQueryFactory
From: https://www.cnblogs.com/sunny3158/p/17786895.html

相关文章

  • MySQL--子查询与联合查询
    十二、子查询子查询就是一个查询中包含某一个查询select列名from表名where条件12.1出现在列的位置上selectstudentNamefromstudentswheres.studentNo=r.studentNo这类子查询适合放在列的位置上,适合放在条件的位置上,因为查询结果返回的是多行单列的值select(select......
  • springboot 整合 gridfs 、webUploader实现大文件分块上传、断点续传、秒传
    主要的pom.xml:<dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>    </dependency><!--mongodb-->    <dependency>      <groupId>org.spri......
  • echarts动态排序柱状图实现
    <template><divid="pubTaxesFsz"style="height:100%;width:100%"></div></template><scriptlang="ts"setupname="PubTaxesFsz">import*asechartsfrom'echarts/core';i......
  • 「Java开发指南」如何在MyEclipse中使用JPA和Spring管理事务?(二)
    本教程中介绍一些基于JPA/spring的特性,重点介绍JPA-Spring集成以及如何利用这些功能。您将学习如何:为JPA和Spring设置一个项目逆向工程数据库表来生成实体实现创建、检索、编辑和删除功能启用容器管理的事务在上文中,我们为大家介绍了如何用JPA和SpringFacets创建一个Java......
  • cuda vectorized实现矩阵转置
    使用了共享内存和向量化传输,目前为止效果最好的一个实现__global__voidtransposeSmemVec(float*input,float*output,constintX,constintY){__shared__floatsmem[32*4*32];unsignedintix=4*(blockDim.x*blockIdx.x+threadIdx.x);......
  • HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求
    随着移动互联网的逐步成熟,用户的需求越来越细化。鸿蒙生态为开发者提供的HarmonyOSSDK开放能力,高效赋能美团外卖等合作伙伴实现更具象、个性化的开发诉求,给用户提供更丰富便捷的体验。点击链接查看视频:https://www.bilibili.com/video/BV1z94y1L7DA?t=9.9......
  • oracle查询scn
    概述在数据库的恢复过程,有时我们需要查询scn,分享一下具体的方法解决方案SQL>setnumwidth50SQL>setlinesize150pagesize1000SQL>select'D'file_type,file#,checkpoint_change#,statusfromV$datafile_headerunionallselect'L',group#,first_change#,......
  • 基于redis实现防重提交
    自定义防重提交1.自定义注解importjava.lang.annotation.*;/***自定义防重提交*@author*@date2023年9月6日11:19:13*/@Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceRepeatSubmit{/***默认防......
  • 两台笔记本电脑实现同一wifi下访问虚拟主机的WEB服务
    在同一WiFi可以实现两台笔记本设备互相访问共享文件。那一台笔记本如何访问另一台笔记本里的虚拟机里的Web服务呢?客户端A,访问服务端B上的虚拟机C,web服务端口:80001首先,确保服务端B可以正常访问虚拟机C的web服务,可参考:解决Linux(虚拟机VMware)无法联网/静态ip设置(附有li......
  • css实现图片的居中、拉大和缩小
    resize和overflow实现拉大和缩小,绝对定位+transform实现剧中,max-height和max-width限制图片不能超出div的范围<html><head><style>#div{background-color:antiquewhite;height:300px;position:......