0

nHibernate を使用して、postgis ジオメトリ列を wkt として読み取る必要があります。nHibernate Spatial を使用できることはわかっていますが、それは私の場合のオプションではありません。

私はこの投稿を見ました: wkt が別の列に格納され、トリガーを使用して実際のジオメトリを更新するNHibernate (流暢) で非表示のプロパティをマップする最良の方法。ただし、プロジェクトの所有者は、この目的のために余分な列を持つことを望んでいません。

私もこのスレッドを見つけました: Hibernateで PostGIS 列を透過的に使用しますが、それに対する回答はありません。

カスタムタイプを書く必要があると思いますが、正しい方向に向けてくれる人が本当に必要です。以前に Postgresql/postgis を使用したことはありません。

サンクス!

4

2 に答える 2

0

追加の列が必要ない場合は、関数を使用して元のテーブルからデータを取得し、実際のテーブルを更新する代わりにビューにトリガーを作成するビューを作成できます。

于 2013-05-08T19:22:27.470 に答える
0

nHibernates sql-interceptor を使用して問題を解決しました。最も堅牢なソリューションではありませんが、この方法で PostGis と Oracle に異なるインターセプターを使用できます。

nHibernate.Spatial とそのジオメトリ タイプも調べました。しかし、私は NetTopologySuite を使いたくなかったので、もっと多くのコードを作成する必要があったはずです。

例として、コードの一部を次に示します。

public class PostGisGeometrySqlInterceptor : IInterceptor
{
   ...

    /// <summary>
    /// Modifies all the select statements with geometry so that 
    /// xxx.geometry -> ST_AsText(xxx.geometry)
    /// </summary>
    /// <param name="sql">The original sql string.</param>
    /// <returns>The modified sql string.</returns>
    /// <remarks>
    /// All the geometry fields must be called 'geometry'. 
    /// Works only for one geometry in the sql string.
    /// </remarks>
    public virtual SqlString OnPrepareStatement(SqlString sql)
    {
        if (sql.StartsWithCaseInsensitive("SELECT") && sql.ToString().Contains("geometry"))
        {
            var indexOfGeometry = sql.IndexOfCaseInsensitive("geometry");
            var indexOfSpace = sql.Substring(0, indexOfGeometry).LastIndexOfCaseInsensitive(" ") + 1;

            var oldValue = sql.ToString(indexOfSpace, indexOfGeometry - indexOfSpace + "geometry".Length);
            var newValue = string.Format("ST_AsText({0})", oldValue);
            sql = sql.Replace(oldValue, newValue);
        }
        else if(...)

        ...

        return sql;   
    }
于 2013-05-15T06:53:17.157 に答える