Spring Data JPA中 in 条件参数的传递方式

关于Spring Data JPA中自定义sql 条件的 in参数记录

此文做一个记录,以便以后观看,也希望正在遇到同样问题的同学能有所启发,如果你有更好的方法,或我的做法有问题,请告知下,非常感谢。

下面写两种简单做法,注意下地方:

在此我只记录HQL 中 in 后面参数问题,细节查询方法相关代码就略过,还请见谅

查询接口:

/**
** paramString : 自定义 hql
** paramMap : hql中查询条件的参数
** start:数据开始条数
** max:最大数据条数
**/
public abstract List query(String paramString, Map paramMap, int start, int max);

做法一:拼接条件

不管 in 后面括号里面有多少个参数,使用动态拼接,拼接 HQL过程就不贴代码了,结果以下样式:

HQL

String hql = “select obj from Goods obj where obj.id in(:id_1,:id_2,id_3……)” ;

查询操作

Map<String, Long> paramMap = new HashedMap();
paramMap.put(“id_1”,Long.valueOf(4));
paramMap.put(“id_2”, Long.valueOf(5));
~~~~~~~~~ 省略多个参数拼接 ~~~~~~~~~~~~~~~~~~
List<Goods> goods = goodsService.query(hql , paramMap, 1, 100);

采用这种动态拼接的方式拼接,也是可以查询到数据的,但是有一点一点需要注意,大家都知道 Object作为超类,能够作为大泛型,但是在此,如果作为 paramMap 的泛型后,在添加参数值时,如果实体对象中,id属性类型是什么类型,一定要转换过去 eg:

paramMap.put(“id_1”,Long.valueOf(4)); ——————(因为我的id 是 Long 类型)

做法二:使用集合

HQL

String hql = “select obj from Goods obj where obj.id in(:id)”;

的查询操作:

Map<String, Object> paramMap = new HashedMap();
ArrayList<Object> list = new ArrayList<>();
list.add(Long.valueOf(4));
list.add(Long.valueOf(5));
paramMap.put(“id”, list);
List<Goods> goods = goodsService.query(“select obj from Goods obj where obj.gc.id in(:id)”, paramMap, -1, -1);

而之前的做法是,但是这样写看起来也没毛病,毕竟Object 作为超类,一个Long 还是可以匹配的,编译不会异常,但是跑起来后,当你访问到这块就会出问题,具体异常就补贴了,你可以自己试试:

Map<String, Object> paramMap = new HashedMap();
ArrayList<Object> list = new ArrayList<>();
list.add(4);
list.add(5);
paramMap.put(“id”, list);
List<Goods> goods = goodsService.query(“select obj from Goods obj where obj.gc.id in(:id)”, paramMap, -1, -1);

在此再次注意:

在 hql中,条件字段是什么类型,传参数时一定要注意,如果泛型是大类型,进行实际添加值时,一定要进行进行转化下对应的类型

到此,以上是两种HQL思路,但是由于我是做Android的,公司又没有Java后台开发的,也是困扰我一会儿。

但是在网上搜到解决方案,有说这个参数要写成 Collection<>,其实小数据类型也是可以的,毕竟这个 Collection,作为Java的一个大接口,看到的时候还是比较少。

Spring Data JPA in 查询例子

    /**
     * 查询所有客户
     *
     * @param customer
     * @return
     */
    @SuppressWarnings("unchecked")
    @RequestMapping(method = RequestMethod.POST, value = "/findAll")
    public @ResponseBody
    Iterable<Customer> findAll(@RequestBody Customer customer) {
        Pageable pageable = new PageRequest(customer.getPageNumber(), customer.getSize(), Sort.Direction.DESC,
                "creationTime");
        Specification<Customer> specification = new Specification<Customer>() {
            @Override
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<Predicate>();
                // 所属用户
                String userId = customer.getUserId();
                if (!StringUtils.isEmpty(userId)) {
                    if (userId.contains(",")) { // in查询
                        String[] ids = userId.split(",");
                        CriteriaBuilder.In<Object> in = cb.in(root.get("userId"));
                        for (int i = 0; i < ids.length; i++) {
                            in.value(ids[i]);
                        }
                        list.add(in);
                    } else { // 普通查询
                        list.add(cb.equal(root.get("userId").as(String.class), userId));
                    }
                }
                return cb.and(list.toArray(new Predicate[list.size()]));
            }
        };
        return this.customerRepository.findAll(specification, pageable);
    }

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

(0)

相关推荐

  • 详解Spring Data JPA动态条件查询的写法

    我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. JpaSpecificationExecutor 和其他接口使用方式一样,只需要在你的Dao接口继承即可(官网代码). public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecification

  • Spring Data JPA实现动态条件与范围查询实例代码

    Spring Data JPA为我们提供了Query With Example来实现动态条件查询,当查询条件为空的时候,我们不用做大量的条件判断.但是Query With Example却不支持范围查询(包括日期范围,数值范围查询),本文通过Specification实现了既支持动态条件查询又支持范围查询的方法. 1 实现方式 1.1 范围对象Range定义 import java.io.Serializable; public class Range<E> implements Serial

  • Spring Data JPA实现动态查询的两种方法

    前言 一般在写业务接口的过程中,很有可能需要实现可以动态组合各种查询条件的接口.如果我们根据一种查询条件组合一个方法的做法来写,那么将会有大量方法存在,繁琐,维护起来相当困难.想要实现动态查询,其实就是要实现拼接SQL语句.无论实现如何复杂,基本都是包括select的字段,from或者join的表,where或者having的条件.在Spring Data JPA有两种方法可以实现查询条件的动态查询,两种方法都用到了Criteria API. Criteria API 这套API可用于构建对数据

  • Spring MVC结合Spring Data JPA实现按条件查询和分页

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有. 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 (实现方法主要在SbglServiceImpl.java类中) 前台表现:用kkpaper表现出来 实现效果: 1.实体类 package com.jinhetech.yogurt.sbgl.entity; im

  • Spring Data JPA中 in 条件参数的传递方式

    关于Spring Data JPA中自定义sql 条件的 in参数记录 此文做一个记录,以便以后观看,也希望正在遇到同样问题的同学能有所启发,如果你有更好的方法,或我的做法有问题,请告知下,非常感谢. 下面写两种简单做法,注意下地方: 在此我只记录HQL 中 in 后面参数问题,细节查询方法相关代码就略过,还请见谅 查询接口: /** ** paramString : 自定义 hql ** paramMap : hql中查询条件的参数 ** start:数据开始条数 ** max:最大数据条数

  • 详解Spring Data JPA中Repository的接口查询方法

    目录 1.查询方法定义详解 2.搜索查询策略 3.查询创建 4.属性表达式 5.特殊参数处理 6.限制查询结果 7. repository方法返回Collections or Iterables 8.repository方法处理Null 9.查询结果流 10.异步查询结果 1.查询方法定义详解 repository代理有两种方式从方法名中派生出特定存储查询. 通过直接从方法名派生查询. 通过使用一个手动定义的查询. 可用的选项取决于实际的商店.然而,必须有一个策略来决定创建什么实际的查询. 2.

  • 在Spring Data JPA中引入Querydsl的实现方式

    一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入相关包和配置插件. (1)引入包(注:不需要版本号,Spring Boot 会自动匹配合适的版本) <!-- Querydsl相关包 --> <dependency> <groupId>com.querydsl</groupId> <artifactId&

  • Spring DATA JPA 中findAll 进行OrderBy方式

    目录 Spring DATA JPA 中findAll 进行OrderBy Spring Data JPA使用orderby的一个小坑 Spring DATA JPA 中findAll 进行OrderBy 需要在 repository 中 定义这样的方法 :findAllByOrderByUpdatedAtDesc() public List findAllByOrderByUpdatedAtDesc(); 重要:(中间要多加一个By) findAllByOrderByUpdatedAtDesc

  • Spring Data JPA中的动态查询实例

    spring Data JPA大大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的. 比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用hibernate的时候,可以通过判断条件来拼接SQL(HQL),当然,Spring Data JPA在简化我们开发的同时,也是提供了支持的. 通过实现Criteria二实现的动态查询,需要我们的Repo接口继承JpaSpecificationExecutor接口,这是个泛型接口. 然后查询的时候,传入动态

  • spring data JPA 中的多属性排序方式

    目录 springdataJPA的多属性排序 第一步,引包 第二步,service方法代码 springdataJPA排序问题(orderby) spring data JPA的多属性排序 在此介绍我所用的一种方式: 第一步,引包 import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; 第二步,service方法代码 @Override     public P

  • Spring Data Jpa 中原生查询 REGEXP 的使用详解

    目录 Spring Data Jpa原生查询 REGEXP 的使用 spring data jpa 原生查询(查一个json中的某一字段) Spring Data Jpa原生查询 REGEXP 的使用 REGEXP 与like 有通用之处, 单 regexp 有更好的精确度,更加自由灵活 在jpa 中使用时 :其中 定位符 ^ 在jpa @query 注解中使用时需要加上引用号 e.g @Query(value = "select p.id as id from zt_products AS p

  • Spring Data JPA 复杂/多条件组合分页查询

    话不多说,请看代码: public Map<String, Object> getWeeklyBySearch(final Map<String, String> serArgs, String pageNum, String pageSize) throws Exception { // TODO Auto-generated method stub Map<String,Object> resultMap=new HashMap<String, Object&

随机推荐