是否有任何约定如何在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
所以有人知道如何解决这个问题吗?
答案 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,它不是有效字符之一。