@NamedQuery元素的错误直接来自存储库

时间:2016-02-26 11:22:28

标签: java eclipse jpa spring-orm

我正在开始一个新项目,并且我被告知通常“下载所有内容并构建它”任务。 该项目跨越不同的eclipse项目,所有这些都使用maven进行依赖管理,直到这个特定项目,“导入SVN项目到eclipse - >右键单击 - > configure - >转换为maven项目”已经工作得很好。

这个问题伴随着这个项目。它似乎使用JPA进行数据库访问(有几个带有带注释的@NamedQuery元素的实体类),但是,不知何故,eclipse报告其中一些查询是错误的(“一个select语句必须有一个FROM子句”和“表达式”无效,这意味着它不遵循JPQL语法“是最重复的错误。”

所以这是给出错误的代码示例:

@javax.persistence.Entity
@Table(name = "TABLE_NAME")
    @NamedQueries({
        @NamedQuery(name = UserEntity.ALL, query = "select u from UserEntity u"),
        @NamedQuery(name = UserEntity.ALL_PAGINATION, query = "select u from UserEntity u ORDER BY lower(u.alias)"),
        @NamedQuery(name = UserEntity.ALL_FILTER_PAGINATION, query = "select u from UserEntity u where u.alias LIKE lower(:query) OR u.email LIKE lower(:query) OR lower(u.documentNumber) LIKE lower(:query) ORDER BY u.alias"),
        @NamedQuery(name = UserEntity.COUNT_ALL, query = "select count(u) from UserEntity u") })

在这里,它抱怨第三行(“lower(u.alias)”被标记,并且“lower(:query)”出现在fourht行中的三次。所有这些错误都标有“表达式无效,这意味着它不遵循JPQL语法“。如果需要,我可以提供更多错误。

问题是我是唯一一个犯这个错误的人。我的团队中的另一个开发人员很久以前得到了他的东西,他的项目没有失败,这让我觉得它与依赖关系有关。

项目的pom.xml文件如下:

    <!--  JPA  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>            
    </dependency>

我在nexus服务器中搜索并将javax.persistence更改为上一版本的特定代码无效:

<dependency>
  <groupId>javax.persistence</groupId>
  <artifactId>persistence-api</artifactId>
  <version>1.0.2</version>
</dependency>

另一个开发人员不知道发生了什么,我一生中没有使用过JPA,但我强烈认为我的问题不需要对实际语法做任何事情。我已经尝试过多次,我记得重新下载所有内容并重新编写/更新它。该项目不可能是错误的,因为它是在2年前上传的并且从未被触及(或者看起来如此),所以它必须是与依赖项或配置相关的东西,但我不知道现在在哪里移动

我在这里缺少什么?

编辑: 好吧,这段代码(我们称之为ProjectDep)是对ProjectA的依赖。我向其他开发人员询问了该代码项目的.jar文件,看看它是否有效,并且它运行正常(关闭我的ProjectDep版本之后)。

这是SVN代码的错误行之一:

@javax.persistence.Entity
@Table(name = "TABLE_NAME_WHATEVER")
@NamedQueries({
        @NamedQuery(name = FormNameEntity.ALL, query = "select ns from FormNameEntity ns"),
        @NamedQuery(name = FormNameEntity.BY_FLOW_ID, query = "select ns from FormNameEntity ns where formFlowId = :formFlowId") })

在通过Java Decompiler后,这是jar文件中的同一行:

@javax.persistence.Entity
@Table(name="TABLE_NAME_WHATEVER")
@NamedQueries({@javax.persistence.NamedQuery(name="all", query="select ns from FormNameEntity ns"), @javax.persistence.NamedQuery(name="byFlowId", query="select ns from FormNameEntity ns where formFlowId = :formFlowId")})

它们完全不同,似乎jar文件有更多差异。不过,这也不是出现错误消息的原因。

1 个答案:

答案 0 :(得分:0)

好吧,我设法解决了这个问题。

事实证明,错误是a known bug in Kepler,这可以通过禁用JPA验证来解决(而且它似乎已经修复了任何进行验证的新版本的错误)并从中重新下载项目SVN。

似乎我的同事从一开始就禁用了验证,他不记得何时禁用它。哦,好吧......