当前位置: 首页 > 知识库问答 >
问题:

Spring JPA-实体类包名中的“in”字-导致JPQL错误

穆理
2023-03-14

在使用Hibernate的Spring数据中观察到的问题-Spring 4.1.5.RELEASE,Spring数据-1.8.0.RELEASE,Hibernate4.3.8.Final

公司的域名以 .in 结尾,就像在印度一样。因此,我的Java包以“in.something....”开头。

在使用JPA存储库时,如果我必须对以下方法使用自定义查询:

@Query(value = "SELECT o FROM UserEntity o, UserAttribute u where o.organization.organizationType.code in ?1 and o.status in ?2 and u.attrKey = 'SOL_ID' and u.attrValue in ?3 and u.userEntity = o") 

Page<UserEntity> findByOrganizationAndStatusAndSolId(List<String> organizationTypes, List<StatusMaster> statusList, List<String> solId, Pageable pageable);

应用程序启动失败,因为JPA查询具有类的完全限定名称,并且由于包以“in”开头,它认为存在验证错误。

Cause: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expect open, found '.' 靠近第 1 行,列 44 [SELECT o FROM in.something.UserEntity o, in.something.UserAttribute u 其中 o.organization.organizationType.code in ?1 和 o.status in ?2 和 you.attrKey = 'SOL_ID' 和 you.attrValue in ?3 和 you.userEntity = o]

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract org.springframework.data.domain.Page in.something.UserRepository.findByOrganizationAndStatusAndSolId(java.util.List,java.util.List,java.util.List,org.springframework.data.domain.Pageable)!
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:97)
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:66)
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.fromQueryAnnotation(SimpleJpaQuery.java:169)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:114)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:160)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:290)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:158)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.html" target="_blank">java:44)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 37 more
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting OPEN, found '.' near line 1, column 44 [SELECT o FROM in.something.UserEntity o, in.something.UserAttribute u where o.organization.organizationType.code in ?1 and o.status in ?2 and u.attrKey = 'SOL_ID' and u.attrValue in ?3 and u.userEntity = o]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)

我尝试了各种选择,但没有运气:

  1. 使用此处的建议在实体中使用转义表名称

对此的任何投入都将受到高度赞赏。

更新:当我的包以“com.something”开头时,代码曾经运行良好。但是,我重新分解了代码来修复包名,之后,问题开始出现

如果查询被修改为使用< code > SELECT o FROM user entity o JOIN o . attributes u...然后错误消失。

更新3-更新中也发现问题

@Query(value="UPDATE WebSessionEntity o SET o.lastAccessedOn = ?2 WHERE o.authSessionToken = ?1")
public int updateLastAccessedOn(String authSessionToken, Date accessDate);

假设 WebSessionEntity 以包名称“in.something...”开头,则应用程序不会启动。在启动期间,我收到Hibernate验证错误:

2015-03-24 18:52:00,810 [main] ERROR org.hibernate.hql.internal.ast.ErrorCounter - line 1:8: unexpected token: in line 1:8: unexpected token: in    
at org.hibernate.hql.internal.antlr.HqlBaseParser.updateStatement(HqlBaseParser.java:210)
...
...
Caused by: java.lang.IllegalArgumentException: node to traverse cannot be null!     
at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63)  
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:272)

共有1个答案

谷梁永年
2023-03-14

按照惯例,当域名干扰包的命名时,会使用下划线。

链接-https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

链接摘录,

在某些情况下,互联网域名可能不是有效的软件包名称。如果域名包含连字符或其他特殊字符,如果包名称以数字或其他非法用作 Java 名称开头的字符开头,或者包名包含保留的 Java 关键字(如“int”),则可能会发生这种情况。在这种情况下,建议的约定是添加下划线。

 类似资料:
  • 公司的域名以.in结尾,因为它在印度。因此,我的Java包以“in.something...”开头。 在使用JPA存储库时,如果我必须对如下所示的方法使用自定义查询: 应用程序启动失败是因为JPA查询具有类的完全限定名称,并且由于package以“in”开头,它认为存在验证错误。 null 在这方面的任何投入都将受到高度赞赏。 更新:当我的软件包以“com.something”开头时,代码可以正常

  • 我是JPA和Hibernate的新手。我有两个实体,供应商和产品,如下所述。 我的问题与@ManyToOne注释中使用属性 有关。我希望用@ManyToOne注释的相应列不为空。但是,当我使用以下测试测试实体的持久性时: 其中createOrUpdateEntity方法是DAO Bean对象的一部分 我收到错误: 编辑:实现此示例,该示例使用注释为 null 可为 null = false 的@M

  • 两个表格: 实体类(基本结构): SQL查询和结果: JPQL查询: *我知道我在上面给定的结构中没有它,但我想知道如何正确操作。我该如何从“ManyToOne”、“OneToOne”等选项中进行选择。 如何修改实体类和JPQL查询以获得与SQL查询相同的结果?我一直在尝试各种各样的事情,但都不管用。它不允许我创建两个具有相同列名的字段,也不允许我将字符串定义为@JoinColumn。我几乎成功了

  • 问题内容: 从以下代码 如果我添加一个return语句,它将起作用,并且错误消失了 任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。 这是我的课程测试 编辑 我已经完成了一个基于操场的简约示例(请复制粘贴以进行测试) 问题答案: 任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。 您已经很好地解决了问题。匿名函数自动使用单行函数主体作为返回值,因此,要防止这种

  • 页面URL:[https://flutter.dev/docs/cookbook/design/package-fonts.html][1] 页面来源:[https://github . com/flutter/website/tree/master/src/docs/cookbook/design/package-fonts . MD][1] 问题描述: 我一直在尝试从Flutter.dev食谱

  • 如果要筛选列值中包含字符串的行,可以使用类似于(前面回答:检查pandas dataframe列中的字符串是否在列表中,或者检查字符串是否在pandas dataframe中)。 但是,我的查找列包含emtpy单元格。因此,