0

でパラメーターに名前を付ける方法はありますJPQLか?今日、いくつかのデバッグの後、コロンなどの名前を内部に入れることができないことに気付いたからです。

また、何らかの理由で定数をパラメーター名として使用できないという2番目の問題を発見しました。私はいつも

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;
}

+ ゲッター、セッター、その他のプロパティ

プロバイダはある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 によると、有効な文字の 1 つではありません。

于 2012-07-30T09:51:55.747 に答える