jpa使用自定义查询条件

涛sir:http://www.cnblogs.com/it-taosir/p/9874033.html

意思就是jpa中使用类似like(模糊查询)和 limit (分页)查询结合,通过以下例子解析:

可理解为like,实际效率是比模糊查询like效率高的

建表:sql

create table order_info
(
   order_id             varchar(30) not null,
   source_id            varchar(30),
   serial_no            varchar(30),
   source_system        varchar(20),
   channel_mark         varchar(5),
   cust_type            varchar(4),
   cust_name            varchar(60),
   goods_sku            varchar(64),
   order_provinc_code   varchar(6),
   order_city_code      varchar(6),
   flow_node_code       varchar(255),
   status               int comment ‘0 未锁定 1 锁定  2挂起‘,
   create_user_id       bigint,
   create_dt            datetime,
   update_dt            datetime,
   visible_status       varchar(4) comment ‘0 可见 1 不可见‘,
   lock_user_id         bigint,
   lock_user_name       varchar(64),
   claim_dt             datetime,
   verify_flag          smallint comment ‘null 未审核,0 自动审核未通过 1 自动审核通过‘,
   create_user_no       varchar(64) comment ‘创建人工号‘,
   create_user_name     varchar(64),
   oper_user_id         bigint,
   oper_user_no         varchar(64) comment ‘处理人工号‘,
   oper_user_name       varchar(64),
   amount               bigint,
   disacount            bigint comment ‘优惠金额‘,
   pay_money            bigint,
   pay_type             varchar(10) comment ‘HDFK 货到付款,ZXZF 在线支付‘,
   payment_type         varchar(10) comment ‘XJZF 现金支付,POSC POS机刷卡等‘,
   pay_status           smallint comment ‘0 未支付 1 已支付‘,
   goods_name           varchar(200),
   exception_type       int,
   lock_user_no         varchar(64),
   flow_code            varchar(255),
   primary key (order_id)
);

实体类:

package cn.chinaunicom.srigz.orders.api.database.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Entity
@NoArgsConstructor
public class OrderInfo implements Serializable {
    private static final long serialVersionUID = 1063821955023696541L;

    @Id
    private String orderId;
    private String sourceId;
    private String serialNo;
    private String sourceSystem;
    private String channelMark;
    private String custType;
    private String custName;
    private String goodsSku;
    private String orderProvincCode;
    private String orderCityCode;
    private String flowNodeCode;
    private Integer status;
    private Long createUserId;
    @Column(name = "create_dt", columnDefinition = "DATETIME")
    private Date createDt;
    @Column(name = "update_dt", columnDefinition = "DATETIME")
    private Date updateDt;
    private String visibleStatus;
    private Long lockUserId;
    private String lockUserName;
    @Column(name = "claim_dt", columnDefinition = "DATETIME")
    private Date claimDt;
    private Integer verifyFlag;
    private String createUserNo;
    private String createUserName;
    private Long operUserId;
    private String operUserName;
    private Long amount;
    private Long disacount;
    private Long payMoney;
    private String payType;
    private String paymentType;
    private Integer payStatus;
    private Integer exceptionType;
    private String lockUserNo;
    private String flowCode;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name = "orderId")
    private List<GoodsInfo> goodsInfos;
}

Repository:直接拷贝了,其实只要继承两个接口即可

package cn.chinaunicom.srigz.orders.api.database.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import cn.chinaunicom.srigz.orders.api.database.model.OrderInfo;

public interface OrderRepository extends JpaRepository<OrderInfo,String>, JpaSpecificationExecutor<OrderInfo> {
    @Query(value="SELECT * from order_info where lock_user_id=?1 AND status=1",nativeQuery=true)
    List<OrderInfo> selectMyOrders(String lockUserId);

    @Modifying
    @Transactional
    @Query(value="UPDATE order_info SET lock_user_id = NULL AND status = 0 WHERE order_id = ?1",nativeQuery = true)
    void unlockOrderByOrderId(String orderId);
}

service:主要是这块的代码实现

涉及Specification对象的使用,使用匿名内部类重写Predicate toPredicate方法,

在toPredicate方法里按如下例子,设置查询的条件

最终使用findAll的重载方法进行分页查询

/**
     * 自定义条件查询
     * 分页
     */
    @SuppressWarnings({ "deprecation", "serial" })
    public Page<OrderInfo> findByPageAndParams(OrderInfo params, int pageSize, int pageNumber) {
        Pageable pageable = new PageRequest(pageNumber, pageSize);
        Specification<OrderInfo> orderInfo=new Specification<OrderInfo>() {
            //重写查询条件
            @Override
            public Predicate toPredicate(Root<OrderInfo> root, CriteriaQuery<?> query,
                                         CriteriaBuilder criteriaBuilder) {
                //查询条件设置为:字段source_system中包含的条件查询
                Path<String> sourceSystem = root.get("sourceSystem");
                return criteriaBuilder.like(sourceSystem, "%"+params.getSourceSystem()+"%");
            }
        };
        return orderRepository.findAll(orderInfo, pageable);
    }

controller:Page对象封装了很多数据,我们只要取所需的即可

   /**
     * @param orderInfo
     * @param pageSize
     * @param pageNum
     * @return
     */
    @ApiOperation(value="按主题资源匹配查询", notes="SourceSystem")
    @RequestMapping(value = "/api/v1/orders/findBySourceSystem" ,method = RequestMethod.POST)
    public Object findBySourceSystem(
            @ApiParam(required = true, value = "符合SourceSystem的条件") @RequestBody OrderInfo orderInfo,
            @ApiParam(required = true, value = "每页条数") @RequestParam int pageSize,
            @ApiParam(required = true, value = "查询第几页") @RequestParam int pageNum
            ){
        Page<OrderInfo> page= orderService.findByPageAndParams(orderInfo,pageSize,pageNum);
        List<OrderInfo> list=page.getContent();
        return ActionHelper.responseOk(list);
    }

原文地址:https://www.cnblogs.com/big-cut-cat/p/9880430.html

时间: 2024-08-26 18:47:32

jpa使用自定义查询条件的相关文章

自定义查询条件存储过程

create procedure pro_aaa (     @canshu1 nvarchar(200),     @canshu2 nvarchar(200) )  as  begin  declare @strsql nvarchar(2000)  set @strsql='select * from table1 where 1=1'[email protected]  exec(@strsql)  end 自定义查询条件存储过程

JEECG中datagrid方法自定义查询条件

自定义加添加查询条件的用法: CriteriaQuery cq = new CriteriaQuery(EquipmentEntity.class, dataGrid); //查询条件组装器 org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, equipment, request.getParameterMap()); cq.add(Restrictions.or(Restrictions.in("per

jeecg 扩展封装查询条件 时间段查询

使用jeecg框架开发的小伙伴们知道,添加查询条件,通常是我们加一个配置(query="true")就可以将该字段设置为查询条件.简单方便.但是这样的配置查询条件仅适用于输入框输入查询和下拉框查询(如果你配置的该字段使用了replace).显然,这样的查询条件根本满足不了我们的需求,最常见的就是时间段查询,以及时间段与其他字段混合查询的情况,下面简单说一下解决方法. 自定义查询条件, 第一步:将字段中所有配置的query="true",改为query="f

通过视图实现自定义查询&lt;持续完善中。。。&gt;

目前实现: ----普通查询路径 /viewShow/viewShow/list.htm ----Echarts查询路劲 /viewShow/viewShow/echarts.htm 1.自定义查询条件 2.自定义展示数据 3.右击数据单列 求和.求平均 4.Echarts饼图.折现图.柱状图 5.指定导出模板 传参条件: //视图名称,一般用大写,如 JX_VIEW_YGJC view_name //指定模板位置,如 E:/AppServer/sunbmp/export/JX_VIEW_YGJ

【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application.properties与 Chapter1 相同 实体类映射数据库表 user 实体类 @Entity public class User implements Serializable { private static final long serialVersionUID = -39076354

Jpa自定义查询报错(Failed to convert from type [java.lang.Object[]] to type)

Jpa自定义查询报错 问题背景 今天遇到一个奇怪的报错"Failed to convert from type [java.lang.Object[]] to type",这个报错,百度上也是很少的,恰恰是这样的问题,引起我了解决的欲望.先看看报错: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.Object[]] to type [o

SpringBoot Jpa 自定义查询

SpringBoot Jpa 自定义查询 持久层Domain public interface BaomingDao extends JpaRepository<BaomingBean,Integer> { @Query(value = "select distinct t.actid from BaomingBean t where t.belongs=?1") List<String> findDistinctActid(String belongs); /

thinkphp 条件查询 模糊查询 区间查询 in 查询 与自定义查询

eq => '=' $map['id']= array('eq','2'); neq => '<>' $map['id']=array('neq',2); gt => '>' $map['id']=array('gt',3); egt => '>=' $map['id']=array('egt',3); lt => '<' $map['id']=array('lt',3); elt => '<=' $map['id']= array(

Spring Hibernate JPA 联表查询 复杂查询

(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用? Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可