1

サンプルとパラメーターの 2 つのクラスがあります。サンプル ID とパラメーター ID を保持するために存在する sample_sample_parameter ルックアップ テーブルもあります。これは私のgrailsアプリでマッピングされています。

リスで動作するSQLクエリを書くことができました:

select s.* from sample s, sample_sample_parameters sp where s.id = sp.sample_id and sp.sample_parameter_id = 41

41 は、gsp ページからアクションに渡される parameter.id 変数に置き換えられます。私もexecuteQueryで動作させようとしましたが、サンプルがマップされていないことがわかりました。

このクエリを gorm 認識可能な形式に変換するにはどうすればよいですか?

class Sample {


Date collectionDate // date the sample was collected
Date sampleReceivedDate // date the sample arrived on site
Date dateCreated
String sampleComments // details about the sample
String labAccessionID // internal reference
String sampleGender // is it from a male or female?
String sampleAge // the age of the animal the sample was taken from
String sampleBreed // the breed of animal
String sampleNameID // patient name
String filepath

String enteredby


String sg
String mosm

static searchable = true


static hasMany =[sampleParameters:SampleParameter, ficsruns:Ficsrun]//[tags:Tag]// a Sample can have many parameters
/* mappedBy allows two tables share a common table. It creates two join tables, one for each. 
 * SampleParameter is the table being shared by Sample and SampleType tables */
static mappedBy=[sampleParameters:"samples"]//[tags:"domainClass1s"]/*http://www.van-porten.de/2010/09/multiple-many-to-many-in-grails/*/
static belongsTo = [sampleType:SampleType, labFinding:LabFinding, sampleSource:SampleSource, species:SpeciesList] // creates dependencies


static constraints = {

    sampleType(blank:false)
    sampleNameID(blank:false)
    collectionDate(blank:false)
    sampleReceivedDate(blank:false)
    sampleComments(nullable:true, maxSize:1000)
    labAccessionID(nullable:true)
    sampleGender(blank:false, inList:["M","F","NM","SF", "UNK"])
    sampleAge(nullable: true)
    sampleBreed(nullable:true)
    sampleSource(blank:false)
    species(blank:false)
    labFinding(nullable:true)
    filepath(nullable:true)
    enteredby(nullable:true)
    sg(nullable:true)
    mosm(nullable:true)
    dateCreated()
}

/* This section is for static mapping to the hematology database*/
   static mapping = {
    version false
    id generator:'sequence', params:[sequence:'SHARED_SEQ']   
   }

   String toString(){
    "${sampleNameID}"
  }
}


class SampleParameter implements Comparable{


String name
String value

static hasMany = [
samples:Sample,         //domainClass1s: DomainClass1,
sampleTypes:SampleType  //domainClass2s: DomainClass2
]
static mapping = {
    version false
    id generator:'sequence', params:[sequence:'SHARED_SEQ']   
}

  static mappedBy =        [samples:"sampleParameters",sampleTypes:"sampleParameters"]//[domainClass1s: "tags", domainClass2s: "tags"]
  static belongsTo =[Sample,SampleType] //[DomainClass1, DomainClass2]

  static constraints = {
     name(blank:false)
     //value()
     //value(unique:true)
     value (unique: 'name')
 }

@Override public String toString() {
return name + " " + value
}

@Override
public int compareTo(Object o) {
    if (o == null || this == null) {
        return 0;
    } else {
        return value.compareTo(o.value)
    }
}
}
4

3 に答える 3

2

最初の提案として、パラメーターの ID を取得したら、次のようにします。

Parameter p = Parameter.get(params.id) // or wherever your id is stored
List<Sample> samples = Sample.findAllByParameter(p) // this assumes, the parameter property is actually named 'parameter'

Of course there is no error handling in place right now, but you'll get the idea.

Welcome to GORM, welcome to Grails.

于 2012-08-09T18:52:30.783 に答える
1

問題は、executeQuery メソッドで HQL クエリを使用していないことです。代わりに、ネイティブ SQL を使用しています。マニュアルから:

executeQuery メソッドを使用すると、任意の HQL クエリを実行できます。

仕様を見て、それを行う方法を確認してください。ちなみに、これはネイティブ SQL よりもはるかに簡単です。

于 2012-08-09T19:42:02.173 に答える
1
List<Sample> samples = Sample.findAllBySampleParameter(SampleParameter.get(variable))

試してみる?

于 2012-08-09T20:56:15.227 に答える