これらのどれもが出て、具体的な何かを綴るませんが、彼らは助けることがあります。
http://grails.1312388.n4.nabble.com/How-can-I-get-the-column-name-that-a-property-maps-to-for-a-domain-class-td4633766.html
How to get the name of the table GORM object is mapped to?
私は特定の何かを発見していないが、これはすべてでありますむしろ奇妙です。私はあなたが既に知っていることを意味し、これはいくつかの動的クエリであると推測します。そうでなければ、一緒に問い合わせるべきものを知っているでしょう。
何とか回避策として、これはすでにどちらの場合で書かすなわち何を書いていないの場所や思考に入れている何かである場合、あなたが質問
//
static String getDataSrc() {
return 'data_source_a'
}
//or
static boolean canQuery() {
return true/false
}
内のすべてのドメインクラスに独自のゲッターを追加することができれば、そしてあなただけのどこからでもチェックすることができますこのような何か:
boolean canQuery = UserAttributes.canQuery()
String currentDataSource = UserAttributes.dataSrc
静的メソッドなので、インスタンス化は必要ありません。
User user = User.get(1)
if (user.canQuery()) {
// this is ok
}
あなただけ大文字のクラス名とそのメソッドを参照することで、どこからでも直接メソッドを呼び出すことができます。これは、あなたが
ユーザオブジェクト(1)あなたがする必要はありませんがある場合を意味します。
String currentDataSource = UserAttributes.dataSrc
//Where this is exactly the same as above
String currentDataSource = UserAttributes.getDataSrc()
E2A:答えは:あなたがリストを比較する必要があるので、
import org.grails.orm.hibernate.cfg.GrailsDomainBinder
class TestController {
//either this method
def binder = new org.grails.orm.hibernate.cfg.GrailsDomainBinder().getMapping(Photos.class)
println "binder : ${binder.table.name}"
println "b: ${binder.datasources}"
//Or this
def dc=GrailsDomainBinder.getMapping(Photos.class)
println "-dc is ${dc}"
println "${dc.datasources}"
}
dc.datasources
リストです。もちろん
愚かな私を、あなたは、動的テーブル名を与えているHQLでのようなものを照会している場合は$ {にtableA} $ {TABLEB}
あなたは
GrailsDomainBinder
を呼び出すことができるように、実際のドメインクラスにアクセスする必要があります
So something like:def domainClass = grailsApplication.getDomainClass(domain).clazz
が与えられたtableNameのために、あなたの実際のdomainClassを与えるだろう。しかし、あなたのドメインは完全修飾パッケージ名でなければなりません。 )あなたは、サービス/コントローラの外にいる場合ので、あなたは代わりに使用することができcom.domain.users.tableA
とcom.domain.info.tableB
を照会する場合:
def domainClass=Holders.grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz
または保有せず、あなたがコントローラサービスにgrailsApplicationを宣言している場合:
def domainClass=grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz
も実際に各クラスのデータソース名を静的な文字列として宣言してから、ドメインオブジェクトのデータソースをその静的宣言に設定することができます。上記のように静的な文字列を再利用すると、mapping = {dataSource = dataSrc}となり、クラスごとに一度だけ宣言されます。 – Vahid
@vahidにお返事ありがとうございます。可能であれば、各クラスにコードを追加してデータソースの名前を返すことを避けたいと思います。私はたくさんのクラスを持っています。それは首のメンテナンスに苦労します。しかし、あなたが提供したリンクから何かを見つけ出すことができるかどうかがわかります。これまで有望なGrailsDomainBinder.getMapping(MyClass)が見つかりましたが、メソッドのシグネチャはありません:静的GrailsDomainBinder.getMapping()は引数タイプに適用できます:(java.lang.Class)values:[MyClass ]可能な解決策:getMapping(java.lang.Class)、getMapping(GrailsDomainClass) " –
GrailsDomainBinderで私の回答が更新されました@DavidLeaman – Vahid