首页 > 其他分享 >解决升级SpringBoot3 JPA报Could not locate TableGroup问题

解决升级SpringBoot3 JPA报Could not locate TableGroup问题

时间:2024-12-10 10:09:33浏览次数:4  
标签:locate criteriaQuery TableGroup JPA 查询 criteriaBuilder predicates new where

产品技术架构从SpringBoot2.x升级到SpringBoot3.x后,对原有代码进行单元测试时发现,之前通过CriteriaQuery查询对象实现的分页查询功能,在进行记录数count查询时,会抛出SqlTreeCreationException: Could not locate TableGroup异常。

通过排查发现,SpringBoot2.x依赖的是Hibernate 5.xSpringBoot3.x依赖的是Hibernate 6.x,在进行count记录数查询时,查询条件直接拿的分页查询的Predicate,而Hibernate 6.x中在一个 CriteriaQuery 的 where 子句中使用另一个 CriteriaQuery 的根节点会导致 "找不到 TableGroup" 错误,示例代码如下:

// 分页查询
criteriaQuery = criteriaBuilder.createQuery(entityClass);
entityRoot = criteriaQuery.from(entityClass);
// 设置查询条件
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(criteriaBuilder.equal(entityRoot.get(Reflections.fnToFieldName(fn)), "张三"));
criteriaQuery.where(predicates.toArray(new Predicate[0]));
// ...省略部分查询代码

// 记录数查询
CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
Root<T> countRoot = countQuery.from(entityClass);
// 设置当前记录数统计的Root别名,和条件查询entity的Root别名保持一致
// 解决select _user1.id from user _user1 where _user0.name = '' and _user0.sfsc = 'N';别名不一致问题
countRoot.alias(entity.getAlias());
countQuery.select(criteriaBuilder.count(countRoot));
// 直接使用上面的predicates,会抛出异常
countQuery.where(predicates.toArray(new Predicate[0]));
// ...省略部分查询代码
JpaSystemException: Could not locate TableGroup

解决方案

// 分页查询
HibernateCriteriaBuilder criteriaBuilder = entityManager.unwrap(Session.class).getCriteriaBuilder();
JpaCriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);
Root<Entity> entityRoot = criteriaQuery.from(Entity.class);
// 设置查询条件
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(criteriaBuilder.equal(entityRoot.get(Reflections.fnToFieldName(fn)), "张三"));
criteriaQuery.where(predicates.toArray(new Predicate[0]));
// ...省略部分查询代码

// 记录数查询
Long total = entityManager.createQuery(criteriaQuery.createCountQuery()).getSingleResult();

标签:locate,criteriaQuery,TableGroup,JPA,查询,criteriaBuilder,predicates,new,where
From: https://www.cnblogs.com/changxy-codest/p/18596778

相关文章

  • Spring Data JPA自动生成表时列顺序混乱的解决办法(最新版)
    最近把SpringBoot的版本升级到了3.3.5,突然发现一个问题:当使用SpringDataJPA自动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了。比如,有一个下面这样的Entity:@Data@Entity(name="t_config")@EntityListeners(AuditingEntityListener.class)publicclassConf......
  • 查找指定的文件:find、locate、which、whereis
    Linux上查看某个文件的几种方式:1、findfind命令找某个文件的方式,可以指定路径,如指定路基下查找"src.h"#在/usr/include-name目录下搜索src.h文件find/usr/include-name"src.h"#在根目录下搜索src.h文件,忽略错误信息,如没有权限访问的位置find/-name"src.h"......
  • 第二百七十一节 JPA教程 - JPA查询like Escape示例
    JPA教程-JPA查询likeEscape示例如果模式字符串包含应匹配的下划线或百分号,则ESCAPE子句可以使用\指定转义字符:SELECTdFROMDepartmentdWHEREd.nameLIKE'QA\_%'ESCAPE'\' 例子下面的代码来自PersonDaoImpl.java。packagecn.w3cschool.common;importjava.......
  • 第二百六十节 JPA教程 - JPA查询命名参数示例
    JPA教程-JPA查询命名参数示例JPQL支持两种类型的参数绑定语法。第一种是位置绑定,其中参数在查询字符串中通过问号后面跟随参数号来指示。执行查询时,开发人员指定应替换的参数编号。SELECTeFROMEmployeeeWHEREe.department=?1ANDe.salary>?2命名参数......
  • 易优CMS出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate 2
    当你遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误时,这意味着PHP的内存限制已经耗尽。这种错误通常发生在处理大量数据或执行复杂计算时。为了解决这个问题,可以采取以下几种方法:方法1:修改 php.ini 文件(推荐)找到 php......
  • SpringBoot整合JPA,配置多数据库
    SpringBoot创建项目非常方便,而且进行数据访问抛弃了很多繁琐的配置,我前面写的系列博文中,有教大家如何使用SpringBoot进行数据访问,里面谈到了整合JDBC、MyBatis以及JPA。我自己实际开发中,如果没有什么要求限制的话,比较习惯使用JPA进行数据访问,所以在这里,我专门编写一篇博文,来教如何......
  • E: Unable to Locate Package**:无法定位包的完美解决方法 ️
    E:UnabletoLocatePackage**:无法定位包的完美解决方法......
  • jpa适配mysql切换达梦可能的坑
    1、liquibase脚本(1)达梦数据库不支持,修改字段varchar改成blob<changeSetauthor="ly"id="v3.0_4_202307111505_101"><renameColumntableName="PC_SS_ZRQD"oldColumnName="BHNR"newColumnName="BHNR"columnDataType=&q......
  • 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo
    主要包含:springboot+jpa+hibernate+mysql+lombok(两年前写过一个,现在重新记录一个)1. 目录结构: 2.pom 文件1<?xmlversion="1.0"encoding="UTF-8"?>2<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.or......
  • 第二章 数据访问:JPA spring boot
    学习目标2.1相关概念2.1.1JPA由来2.1.2JPA是什么2.1.3SpringDataJPA2.2快速上手2.3核心功能2.3.1基本操作2.3.1.1预生成方法2.3.1.2自定义查询2.3.2复杂操作2.3.2.1自定义QL查询2.3.2.2命名QL查询2.3.2.3分页查询2.3.2.4复杂查询  (如果没有了......