1

Google App Engineプロジェクトの一部としてDataNucleusを使用していますが、永続化の列で少し問題が発生しています。

@PrimaryKey(column = "user_id")
@Column(name = "user_id")
@Persistent(name = "user_id", column = "user_id", valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key m_id;

@Column(name = "user_name")
@Persistent(name = "user_name", column = "user_name")
private String m_userName;

わからない場合は、2つの命名規則があるため(1つはJavaで、もう1つはSQLでうまく機能する)、変数の名前とは異なる名前を列に付けようとしています。とにかく、私はこれらのマーカーアノテーションのすべてのバリエーションを試しましたが、DataNucleusエンハンサーはそれらのいずれかを尊重することを拒否するため、次のようなクエリを実行すると次のようになります。

Query q = pm.newQuery(User.class,
                      "user_name == _username");

私はいつも次のようなエラーが発生します:

org.datanucleus.store.appengine.FatalNucleusUserException:クエリの解析中に予期しない式のタイプ。user_nameという名前のフィールドがオブジェクトに存在することを確認しますか?

もちろん、次のようなクエリを実行すると、次のようになります。

Query q = pm.newQuery(User.class,
                      "m_userName == _username");

...すべてがうまく機能します。user_nameしたがって、これらの注釈のいずれかが尊重された場合に名前が付けられたフィールドがありますが、明らかにそうではありません。

だから私の質問は:私がクエリで使用するトークンをフィールドの名前から切り離す方法はありますか?クエリを手動で編集しなくても、フィールドの名前を変更できる機能を探しています。

注:手作業で恐ろしい量のXMLを記述するよりも、JavaクラスでSQL命名規則を使用する方が早いので、これはアノテーションを使用して行う必要があります。

4

2 に答える 2

2

SQLの話はわかりません。GAE/Jを使用しているため、RDBMSではなくBigTableを使用しているため、SQLは機能しません。@Column は ORM 用であるため、おそらく何もしません。ここでは、クエリ言語として JDOQLa を使用しているため、フィールド名を使用しています。これは、オブジェクト指向のクエリ言語であるためです。これは SQL ではありません。「これ」が嫌い?JDOQL は Java 構文を使用するため、「これ」は非常に理にかなっています。

リファクタリングを可能にするタイプ セーフなクエリ拡張が本当に必要な場合、QueryDSL は DataNucleus で使用するための JDOQL を提供します。

PS DataNucleus エンハンサーは、列名とは何の関係もありません。JDO仕様に従って、フィールドへの更新を検出するための追加のメソッドを追加するだけです。

于 2010-02-27T17:05:24.633 に答える
1

あなたの問題が何であるかを100%確信しているわけではありません。クエリで使用すると、SQL クエリのm_userNameように変換されますか?user_name

Java クラス名と変数に従ってクエリを表現すると、それらは SQL スキーマ テーブルと列名に従って機能するように変換されます。それは、ほとんどの場合、人々が望んでいることです。

ところで、m_idこれm_userNameは Java コードのひどい命名規則です。通常の規則に従うことを強くお勧めします。

于 2010-02-27T14:59:35.247 に答える