如何在查询中转义Hibernate关键字?

时间:2015-06-17 12:37:17

标签: java hibernate escaping spring-data-jpa

不幸的是,我住在白俄罗斯,域名区.BY

我正在使用Hibernate ORM和Spring Data JPA。我在creating new Object in SELECT statement中遇到了困难,因为BY是SQL中的保留字。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

import by.naxa.project.model.Event;
import by.naxa.project.model.Demo;
import by.naxa.project.model.Pair;
import by.naxa.project.model.Response;
import by.naxa.project.model.User;

public interface DemoRepository extends JpaRepository<Demo, Long> {

    /**
     * Find all responses to the given event.
     *
     * @param event Event.
     * @return The list of User-Response tuples.
     */
    @Query("SELECT new by.naxa.project.model.Pair(demo.invitee, demo.response) FROM Demo demo WHERE demo.event = :event")
    List<Pair<User, Response>> findResponsesByEvent(@Param("event") Event event);

}

我的课程是:

部署过程失败,并显示以下日志:

DEBUG main QueryTranslatorImpl:parse:265 - parse() - HQL: SELECT new by.naxa.project.model.Pair(demo.invitee, demo.response) FROM by.naxa.project.model.Demo demo WHERE demo.event = :event
DEBUG main ErrorCounter:reportWarning:63 - Keyword  'by' is being interpreted as an identifier due to: expecting IDENT, found 'by'
DEBUG main HqlParser:weakKeywords:358 - weakKeywords() : new LT(1) token - ["by",<111> previously: <108>,line=1,col=69,possibleID=true]
DEBUG main QueryTranslatorImpl:showHqlAst:283 - --- HQL AST ---
... 
Caused by: java.lang.ClassCastException: org.hibernate.hql.internal.ast.tree.SqlNode cannot be cast to org.hibernate.hql.internal.ast.tree.FromReferenceNode

我确信唯一的错误是关键字by被解释为标识符,因为如果我将包重命名为com.naxa.project,它就会按预期工作。构造函数名称也必须是完全限定的,因此我不能写SELECT new Pair(demo.invitee, demo.response) ...

我尝试使用""'',``(反引号),()[]来转义构造函数名称。

  • 反引号,双引号:
    org.hibernate.QueryException: unexpected char: '`'
  • 单引号,方括号,括号:
    org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found '['

我该怎么办?

1 个答案:

答案 0 :(得分:1)

根据Java Package Naming Conventions

  

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

by.naxa可以重命名为by_.naxa。问题就消失了。

但我仍然在寻找在Hibernate查询中转义构造函数名称的方法。