gpt4 book ai didi

java - Spring JPA - 实体类包名称中的 "in"字 - 导致 JPQL 错误

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:46 26 4
gpt4 key购买 nike

使用 Hibernate 的 Spring-Data 观察到的问题 - Spring 4.1.5.RELEASE,Spring-Data - 1.8.0.RELEASE,Hibernate - 4.3.8.Final

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

使用 JPA Repository 时,如果我必须对如下方法使用自定义查询:

@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”开头,它认为存在验证错误。

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]

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.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. 使用Suggestions from here在实体中使用转义表名称
  2. 使用<delimited-identifiers/>
  3. 在@Entity(name="otherName") 中指定一个名称

对此的任何意见都将不胜感激。

更新:当我的包以“com.something”开头时,代码可以正常工作。但是,我重构了代码以修复包名称,之后,问题开始出现

更新 2如果查询修改为使用 SELECT o FROM UserEntity 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)

最佳答案

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

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

链接的摘录,

In some cases, the internet domain name may not be a valid package name. This can occur if the domain name contains a hyphen or other special character, if the package name begins with a digit or other character that is illegal to use as the beginning of a Java name, or if the package name contains a reserved Java keyword, such as "int". In this event, the suggested convention is to add an underscore.

关于java - Spring JPA - 实体类包名称中的 "in"字 - 导致 JPQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29230286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com