2012-07-30 66 views
0

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

此外,我发现第二个问题,由于某些原因,我不能使用使用常量作为参数名称。我总是会得到

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

也是如此有谁知道如何解决这个问题?

回答

3

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

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

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

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

+0

我更新了我的帖子(我把原来的常量值导致了我的问题)。在这个配置中,我无法构建查询,并且正在获取上述异常。根据规范,下划线不会导致问题,但在我的情况下,当我删除下划线时,问题消失,所以这真的很奇怪 – 2012-07-30 10:39:04

+0

下划线不应该导致问题。如果是这样,那么它违反了规范。由于'。',所有使用的参数名都是无效的。正如Character.isJavaIdentifierPart所指定的那样,它是无效的。 – 2012-07-30 10:42:36

+0

现在我明白了,谢谢你的回答 – 2012-07-30 10:49:05