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

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

戎泰
2023-03-14

公司的域名以.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查询具有类的完全限定名称,并且由于package以“in”开头,它认为存在验证错误。

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)
    null

在这方面的任何投入都将受到高度赞赏。

更新:当我的软件包以“com.something”开头时,代码可以正常工作。然而,我重新调整了代码以修复包名,之后,问题开始出现

更新2如果查询被修改为使用select o FROM UserEntity o JOIN o.attributes u...,那么错误就会消失。

@Query(value="UPDATE WebSessionEntity o SET o.lastAccessedOn = ?2 WHERE o.authSessionToken = ?1")
public int updateLastAccessedOn(String authSessionToken, Date accessDate);
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

链接的节选,

 类似资料:
  • 在使用Hibernate的Spring数据中观察到的问题-Spring 4.1.5.RELEASE,Spring数据-1.8.0.RELEASE,Hibernate4.3.8.Final 公司的域名以 .in 结尾,就像在印度一样。因此,我的Java包以“in.something....”开头。 在使用JPA存储库时,如果我必须对以下方法使用自定义查询: 应用程序启动失败,因为JPA查询具有类的完

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

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

  • 我使用Java EE7和GlassFish 4.1服务器来构建一个系统,基本上你可以在这个系统中发表想法,每个想法都可以有标签。我已经把实体的概念声明为: 阅读JPA:查询实体中的可嵌入列表后,我尝试通过Tag以以下方式查找: 但是我得到了一个TransactionRolledbackLocalException,原因是: 导致:java.lang.IllegalArgumentException

  • 我有一个实体Person,它由name属性组成 我不想在一个额外的表中存储“name”...我将name标记为transient,这样它就不会存储在基础数据库中。 我想要的是将属性“name”映射到数据库中的列“first_name”和“last_name”。 例如,我可以像那样创建一个人 如何实现映射,使基础表包含两个附加列first_name和last_name,内容是从name属性获得的字符

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