0

是否有任何约定如何命名参数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;
}

+ getter、setter 和其他属性

提供者是Hibernate,但查询是纯编写的JPA

那么有谁知道如何解决这个问题?

4

1 回答 1

4

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

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

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

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

于 2012-07-30T09:51:55.747 回答