JPA NamedQuery参数

时间:2012-07-30 09:39:22

标签: java hibernate jpa jpql

是否有任何约定如何在JPQL中命名参数?因为今天经过一些调试我意识到我不能把内部命名为例如冒号。

此外,我发现了第二个问题,由于某种原因,我无法使用使用常量作为参数名称。我会永远得到一个

org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:466)

这是我的代码

@NamedQueries({
    @NamedQuery(
        name=Lookup.GET_LOOKUP_DATA_QUERY, 
        query="SELECT t.textShort, lookup.metaCode, lookup.tableName FROM Lookup lookup, Txt t" +
                " WHERE (lookup.metaCode = t.txtHeadCode OR t.txtHeadCode IS NULL) AND lookup.module.id =:" + Lookup.PARAM_MODULE_ID +
                " AND lookup.metaCode IN (:" + Lookup.PARAM_LOOKUP_META_CODES + ") AND t.lang.metaCode = 'lang_cz'")
})

@Entity
@Table(name = "TABLE")
public class Lookup {

private static final long serialVersionUID = 1L;

public static final String GET_LOOKUP_DATA_QUERY = "Lookup.GetLookupDataQuery";
public static final String PARAM_MODULE_ID = "Lookup.PARAM_MODULE_ID";
public static final String PARAM_LOOKUP_META_CODES = "Lookup.PARAM_LOOKUP_META_CODES";

@Id
@Column(name ="META_CODE")
private String metaCode;

@Column(name = "ID")
private Long id;

@ManyToOne
@JoinColumn(name="MODULE_ID")
private Module module;
}

+ getters,setter和其他属性

提供商是Hibernate,但查询是用纯JPA

编写的

所以有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

您不能使用Character.isJavaIdentifierPart定义的不属于有效标识符的字符。命名参数在JPA 2.0规范中定义:

  

Java Persistence查询语言查询的命名参数是   带有“:”符号前缀的标识符。参数名称   传递给Query和TypedQuery的setParameter方法   接口不包含此“:”前缀   ...
  标识符是无限长度的字符序列。该   字符序列必须以Java标识符起始字符开头,   所有其他字符必须是Java标识符部分字符。一个   标识符起始字符是该方法的任何字符   Character.isJavaIdentifierStart返回true。这包括   下划线(_)字符和美元符号($)字符。一个   标识符部分字符是该方法的任何字符   Character.isJavaIdentifierPart返回true。问号(?)   字符保留供Java持久性查询语言使用。

在构建@NamedQuery的查询字符串时使用常量不会导致问题。它是编译时构造,Hibernate不知道这个查询是否使用常量构建。

在当前查询中,所有命名参数均无效。那是因为'。'。根据Character.isJavaIdentifierPart,它不是有效字符之一。