2017-07-17 7 views
0

nHibernateを実際に実行せずに挿入/更新操作用の生のSQL文を生成することは可能ですか?もちろん、すべて(マッピング、connectionStringsなど)が正しく構成されているとしますか?実行せずにInsert/Update用のnHibernate raw sqlを生成するには?

私が見つけた最も近いものを呼び出すことです:

INSERT INTO Client (FirstName, LastName) values (?, ?) 

しかし、それはまだ私が必要になります。このようになりますSQLIdentityInsertStringを含む型SingleTableEntityPersisterのオブジェクトを返し

Session.SessionFactory.GetClassMetadata(typeof(Client)) 

すべてのプロパティを手動でバインドし、その上にというプロパティがSQLIdentityInsertStringです。それを行うための適切な方法はありますか?

+0

なぜこれをやりたいですか? – mjwills

+0

XMLファイルから多数のクライアントをデータベースにインポートする必要があります。実行する必要がある複数のクエリがありますが、挿入/更新操作のための生のSQLがある場合は、1つのクエリで処理できます。私はすでにハードコードされたSQLクエリでそれをテストしましたが、それはもちろん(それはかなりのスピードアップを提供したにもかかわらず)非常にmaintainableではありません。私は実行時に、手動で行うのではなく、既存のnHibernate設定とマッピングを使用してコードを生成したいと思います。 –

+0

私は、インターセプタインターフェイスまたはベースクラスのいずれかに、使用するSQL文字列を与えるメソッドがあると思います: 'OnPrepareStatement()'。これを利用することができますが、まず作業をシミュレートしてからトランザクションをロールバックする必要があると思います。 –

答えて

1

私が見つけた最も近いことは、文字列ビルダーを使用して独自のSQLクエリを作成することです。まず、あなたのクラスのメタデータを抽出する必要があります:あなたは手動で独自のクエリを構築することができ、その情報を入手したら

var propertyNames = metaData.PropertyNames; 
var tableName = metaData.TableName; 
var firstPropertyValue = metaData.GetPropertyValue(client, propertyNames[0], EntityMode.Poco); 

var metaData = Session.SessionFactory.GetClassMetadata(typeof(Client)) as SingleTableEntityPersister; 

は、その後、あなたのような、他の情報を取得することができます。正確には私が欲しかった解決策ではありませんが、それが得られるほど近かったと思います。

ただし、Session.CreateSQLQuery(string)メソッドが現在バグしているため、10個以上の名前付きパラメータでSetParameterメソッドが機能しないことに注意してください。すでにNHbiernateのJiraで作成されたバグレポートがあるようです。

+0

わずか5時間前に作成されました:[NH-4053](https://nhibernate.jira.com/browse/NH-4053)。 –

関連する問題