2012-04-16 7 views
2

私は、Gormを使って最も近い地理座標のオブジェクトを10個取り出したいと思っています。 get_distance(経度、緯度、経度、緯度) sql関数を使用するには、order()パラメータをカスタマイズしたいと思います。 私はこの一日中苦労しましたが、誰かがヒントを持っていますか?Grails:SQL関数で注文をカスタマイズする方法は?

ありがとうございます!

  • 私は私get_distance()関数を入れて注文することができたしたsqlProjectionを追加しました:私は最終的に私が欲しかったものを行うために管理が、非常に醜い溶液で

    EDIT

    それによります。

  • プロジェクションを追加するとオブジェクトプロパティの取得が取り除かれるので、プロジェクションを追加して明示的にそれを求めなければなりませんでした。私はそれをイントロスペクションで管理しました。
  • 次に、ドメインインスタンスを与える基準の結果トランスフォーマーを定義する必要がありました。

答えて

1

関数をhibernate SQLダイアレクトで登録する場合は、HQLクエリでその関数を使用できます。たとえば、あなたのブートストラップコードでこれを置く:

import org.hibernate.dialect.function.SQLFunctionTemplate 
import org.hibernate.Hibernate 

def dialect = applicationContext.sessionFactory.dialect 
def getDistance = new SQLFunctionTemplate(Hibernate.INTEGER, "get_distance(?1,?2)") 
dialect.registerFunction('get_distance', getDistance) 

次にあなたがHQLでそれを使用することができます。

Location.executeQuery(
    """ 
     select id, get_distance(latitude, longitude) as distance 
     from Location 
     order by distance 
    """, 
    [], [max: 10]) 
+0

お返事ありがとうございました!私は、同じ動作を_createCriteria()_クエリ内で行う必要があります。何か案が ? – Allan

+0

私はあなたが 'sqlRestriction'を使って基準で関数をフィルタリングすることができると思いますが、注文のためにそれを使う方法はわかりません。 – ataylor

0

を私たちがやったことは以下の通りです:

  1. 何でクエリを作成します。 DB固有の演算子ですが、ビューとして
  2. 新しいドメインクラスオブジェクトを作成してビューにマップするだけで、GORM条件のクエリなどを実行できます
+0

良いハックですが、私の場合には当てはまりません:私のget_distance()関数は、指定された座標からの距離を計算する際にパラメータを必要とします: select * from location l get_distance(l.longitude、l.latitude、 :経度、:緯度) – Allan

+0

OK ..私は10年以上DBのストアドプロシージャー/関数で作業していないし、それを解決する最初の方法以外の方法は見当たりません。低レベルの休止状態の角度.. http://stackoverflow.com/questions/7183110/hibernate-stored-procedure-result-problem –

関連する問題