2012-07-30 70 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