`

JPA native query does not support setting list parameters

 
阅读更多

    you might want to do the following highlighted code as:

    whereClause.append("f.id IN (:fleetIdsList)");

     .....    

     query.setParameter("fleetIdsList", fleetIdsList);    

 

     But it only works for JPQL not for Native queries, since JPA native query does not support setting list parameters

 

-----------------------

        StringBuilder query = new StringBuilder();

        query.append("select count(distinct m.id) ");

 

        query.append("from ");

        query.append("central.machine m ");

        query.append("join central.organisation_has_machines ohm on ohm.machine_id = m.id and ohm.end_date is null ");

        query.append("join central.fleet_has_machines fhm on fhm.machine_id=m.id ");

        query.append("join central.organisation o on ohm.organisation_id = o.id ");

        query.append("join central.fleet f on fhm.fleet_id = f.id ");

        if(userId != null) {

            query.append("join central.user_has_fleets uhf on uhf.fleet_id=f.id ");

        }

        query.append("join central.ebox eb on eb.current_machine_id = m.id ");

        query.append("join (select distinct omhs.organisation_machine_id from central.service_feature sf, central.service_plan_has_feature sphf, central.service_plan sp, central.organisation_machine_has_services omhs where sf.name in ('AVL', 'CURRENT_LOCATION') and sphf.service_feature_id = sf.id and sp.id = sphf.service_plan_id and omhs.service_id = sp.id) allowed_service on allowed_service.organisation_machine_id = ohm.id ");

        query.append("left join central.sensor_board sb on sb.ebox_id = eb.id ");

        query.append("left join central.ebox_status ebs on eb.ebox_status_id=ebs.id ");

        query.append("left join central.machine_latest_event_cache le on le.machine_id=m.id ");

 

        query.append("where ");

        

        if(!criteria.getFleetIds().isEmpty()) {

            if(log.isDebugEnabled()) {

                log.debug("Count query. New impl takes precedence: criteria.getFleetIdList()=" + criteria.getFleetIds());

            }

            query.append("f.id in (");

            List<Long> fleetIdList = criteria.getFleetIds();

            int index = 0;

            for(Long fleetId : fleetIdList) {

                query.append(":fleetId").append(fleetId);

                if(++index < fleetIdList.size()) {

                    query.append(",");

                }

            }

            query.append(")");

            query.append(" and ");

        }

        else if(criteria.getFleetId()!=null){

            if(log.isDebugEnabled()) {

                log.debug("Count query. Existing impl: criteria.getFleetId()=" + criteria.getFleetId());

            }

            query.append("f.id = ");

            query.append(":fleetId");

            query.append(" and ");

        }

        

        if(userId != null) {

            query.append("uhf.user_id = ");

            query.append(":userId");

            query.append(" and ");

        }

        if(!StringUtils.isEmpty(criteria.getSearchString())) {

            query.append("(lower(ohm.display_name) like :display_name");

            

            query.append(" or ");

            query.append("lower(ohm.registration_plate) like :registration_plate ");

            query.append(") and ");

        }

        if(criteria.getMachineType()!=null) {

            query.append("m.machine_type = :machine_type ");

        }

        List<String> excludeMacTypes = this.getExcludeMacTypeList(criteria);

        if(excludeMacTypes != null && !excludeMacTypes.isEmpty()) {

            query.append("m.machine_type not in (");

            query.append(":machine_types_to_exclude");

            query.append(") and ");

        }

        if(StringUtils.isNotBlank(criteria.getOrganisationCommonId())){

            query.append("o.common_identifier = :orgCommonId "); 

        } else {

            query.append("true ");

        }

 

        if(log.isDebugEnabled()){

            log.debug("countMachineViewForCriteria Native SQL: "+query.toString());

        }

        

        Query q = em.createNativeQuery(query.toString());

分享到:
评论

相关推荐

    SpringDataJpa 动态复杂查询NativeQuery

    SpringDataJpa 动态复杂查询NativeQuery emm挺长时间没更新了,最近在忙项目,外加搬家,后续会继续更新 遇到一个复杂的sql查询,在不通过外键关联的情况下,只能选择使用原生sql的方式查询,但是遇到一个极其XX的...

    JPA查询实例解析,jpa Query查询

    Jpa详细查询实例介绍,教你如何使用JPA,简单,分类实例。

    在JPA的@Query注解中使用limit条件(详解)

    JPA @Query 注解中使用 Limit 条件详解 在 Java 持久层 API(JPA)中使用 @Query 注解时,需要注意 Limit 条件的使用。在本文中,我们将详细介绍如何在 JPA 的 @Query 注解中使用 Limit 条件。 Limit 条件的使用 ...

    让JPA的Query查询接口返回Map对象的方法

    然而,在JPA 2.0中,使用entityManager.createNativeQuery()执行原生的SQL语句时,query.getResultList()返回的是一个List[]&gt;,每行数据被作为一个对象数组返回。这使得代码不容易让人理解,且不灵活。因此,本文将...

    使用JPA中@Query 注解实现update 操作方法(必看)

    在Java Persistence API (JPA)中,`@Query`注解是用于自定义查询的一种方式,它可以让我们在Repository接口中直接编写SQL或者HQL(Hibernate Query Language)来执行数据库操作。在本例中,我们将详细探讨如何使用`@...

    详解Spring Data JPA使用@Query注解(Using @Query)

    Spring Data JPA 使用 @Query 注解 Spring Data JPA 是一个基于 Java Persistence API(JPA)的数据访问技术,它提供了一种简洁的方式来访问数据库。在 Spring Data JPA 中,我们可以使用 @Query 注解来定义查询...

    jpa例子jpajpa

    4. **查询(Query)**: JPA提供了两种查询方式:JPQL(Java Persistence Query Language)和 Criteria API。JPQL是一种面向对象的查询语言,类似SQL,但操作的是实体而不是数据库表。Criteria API则提供了一个更强大...

    扩展MyBatis JPA支持,简化CUID操作,增强SELECT分页查询

    扩展MyBatis JPA支持,简化CUID操作,增强SELECT分页查询。MyBatis JPA Extra对MyBatis扩展JPA功能:Jakarta JPA 3注释简化CUID操作;Interceptor实现数据库SELECT分页查询;链式Query查询条件构造器;提供starter,简化...

    优秀实践分享 Spring Data JPA2

    JPA 使用@Query注解实现JPQL和本地自定义查询 JPA API 条件查询 (子查询,多表连接查询) JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文版:精通Java持久化API 优秀博文读书笔记: ...

    jpa4-query.sql

    时间宝贵,为了节约用者时间,该资源中包括4张已经建好的表:employee/department/phone/project/中间表,只需要下载添加至mysql数据库即可用

    hibernate-jpa-named-query-xml-annotation-example.zip

    This tutorial show how to use Hibernate/JPA Named Queries. We start by explaining why we would use named queries. Next, we show an example of how to use named queries, either with annotations or XML ...

    国外java源码社区-graphql-jpa-query:为您的JPA实体模型生成GraphQL查询Api

    JPA 实体模型的 GraphQL 查询 Api GraphQL JPA 查询库使用 JPA 2.1 规范为您的 JPA 实体 Java 类使用 GraphQL Java 派生和构建 GraphQL API。 它提供了一个强大的 JPA 查询架构生成器,以使用 JPA EntityManager Api...

    Java工作笔记-JPA中使用@query注解(分页查询实例)

    在JPA中,@Query注解允许开发者编写自定义的SQL或者HQL(Hibernate Query Language)来执行复杂的查询操作。本篇工作笔记将深入探讨如何在JPA中使用@Query进行分页查询,并通过一个实例来展示其具体应用。 首先,...

    使用JPA时@Query中的insert语句之对象传参

    在处理复杂查询时,我们可以利用Spring Data JPA中的`@Query`注解来编写自定义SQL或者HQL(Hibernate Query Language)语句。本篇文章将深入探讨如何在`@Query`中使用对象参数进行INSERT操作。 首先,让我们理解...

    JPA Demo 简单的了解下jpa

    JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; List&lt;User&gt; users = em....

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...

    JPA中文解释,JPA的API

    Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的对象持久化。它简化了在Java应用程序中存储、检索和管理数据的过程,是Enterprise JavaBeans(EJB)的一部分,也是Spring框架中的一个...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    Hibernate JPA提供了JPA规范的全部功能,并且在JPA的基础上扩展了一些特性,如更强大的 Criteria 查询、HQL(Hibernate Query Language)等。Hibernate JPA因其灵活性和广泛社区支持而受到欢迎,尤其是在处理复杂...

    使用SpringBoot-JPA进行自定义保存及批量保存功能

    @Query(value = "INSERT INTO t_student(seq, name, sex) VALUES (getseq('student_seq'), :#{#student.name}, :#{#student.sex})", nativeQuery = true) int insert(@Param("student") StudentDO student); ``` ...

    JPA源文件/jpa学习

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了在Java应用程序中存储、检索和管理对象的工作。JPA是Java EE和Java SE环境中的一种ORM(Object-Relational Mapping)...

Global site tag (gtag.js) - Google Analytics