8

NHibernate を使用してテーブルにマップされたクラスがあります。問題は、一部のプロパティのみがテーブルの列にマップされていることです。表示に使用する列のみがマップされているため、これで問題ありませんが、クラスのプロパティにマップされていないテーブル内の他の列に対してクエリを実行する方法があるかどうか疑問に思っていました。

たとえば、次の列を持つテーブルがあります。

Customer
-----------
CustomerId
Name
DateCreated

オブジェクトがあります

public class Customer
{
    public virtual int CustomerId {get;set;}
    public virtual string name {get;set;}
}

andnamecustomerIdはマップされDateCreatedますが、どこにも表示しないからではありません。Customer特定の日付までに作成された顧客のテーブルをクエリしたいと思います。をマッピングせずにこれを行う方法はありますDateCreatedか? また、基準 API を使用してこれを行うことをお勧めします。

4

3 に答える 3

11

Ayende Rahien は、access="noop"クエリのみのプロパティを指定するためのマッピングでの指定について説明する記事を投稿しました。Hibernate – クエリのみのプロパティを参照してください。私はこれを自分で試していません。

于 2009-07-11T05:12:32.167 に答える
5

プレーンな SQL クエリを使用することは問題外ですか? 現時点ではテストできませんが、Hibernate がオブジェクトにマップできるものをクエリが返す限り、マップされていないフィールドに対してクエリを実行できると思います。(これがオプションとしてすでに除外されていたら申し訳ありません)

編集:これはうまくいくようです:

ISQLQuery query = session.CreateSQLQuery(
                "select c.* " +
                "from Customer c " +
                "where c.CreateDate > :CreateDate");

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14));
query.AddEntity(typeof(Customer));

IList<Customer> results = query.List<Customer>();
于 2009-03-18T06:39:36.923 に答える
5

HQL/Criteria クエリを使用すると、NHibernate はマップされたものだけを操作できます (ただし、Andy White が指摘したように、生の SQL はまだオプションです)。Criteria クエリを使用する場合は、列をマップする必要があります。

ただし、NHibernate はパブリックにアクセス可能なメンバーの使用に制限されていません。そのため、フィールドを非表示にしたい場合はCreateDate、プライベート (おそらく読み取り専用?) プロパティを宣言します。access="field"または、プロパティをスキップして、マッピングでプロパティ要素を設定することにより、NHibernate にフィールド レベルのアクセスを使用するように指示することもできます。

フィールドをマッピングせずにこれをやりたいと思っていたことは知っていますが、(NHibernate ソースを変更せずに ;) それが可能だとは思いません。それでも、フィールドに対してクエリを実行している場合、フィールドはドメインに関連しているため、おそらくそれにマップする価値があり、プライベートまたは保護されたメンバーを使用すると、情報を所定の位置に隠しておくことができます.

于 2009-03-18T13:36:23.097 に答える