2016-07-08 3 views
0

私はテーブルを持っている:jOOQ - カラムとテーブルを関数に渡すには?私のデータベースで

CREATE TABLE calibration_factor_pm1 
(
sensor_id Integer REFERENCES sensor(id), 
factor_a double precision NOT NULL, 
factor_b double precision NOT NULL, 
time_from_which_factor_is_used timestamp NOT NULL 
) 

そして私は、私は要因(AまたはB)Iに関する情報を渡すことができますするためにどの機能を作りたい、このようないくつかの他のテーブルが存在しますので、どのテーブルからフェッチしたいか。

私は、このようにそれを行うにしようとしていた。

private Double getCalibrationFactor(String sensorId, TableField<Record, TableImpl> factor, TableImpl PM, TableField<Record, TableImpl> sensorIdTableField, TableField<Record, TableImpl> timeFromWhichFactorIsUsed) { 
     Double calibrationFactorAPM1 = 1.0; 
     try { 
      calibrationFactorAPM1 = Double.valueOf(Database.create 
        .select(factor) //CalibrationFactorPm1.CALIBRATION_FACTOR_PM1.FACTOR_A 
        .from(PM) //CalibrationFactorPm1.CALIBRATION_FACTOR_PM1 
        .where(sensorIdTableField.equal(Integer.valueOf(sensorId))) 
        .orderBy(timeFromWhichFactorIsUsed.desc()) 
        .fetchOne() 
        .getValue(0) 
        .toString()); 
     } catch (NullPointerException e) { 
      System.out.println("DEBUG: Can't find calibration factor 'a' for this sensor"); 
      e.printStackTrace(); 
     } 
    } 

しかし、私は.where(sensorIdTableField.equal(Integer.valueOf(sensorId)))ライン上Cannot resolve method 'equal(java.lang.Integer)'を取得します。

これに正しくアプローチするにはどうすればよいですか?

@edit

これは(等しいものですが)期待する: equal()'s expectations

+0

あなたのスキーマを考えると、私は 'equal'が' Integer'ではなく 'Double'を期待していると思います。 'sensorIdTableField.equal(Integer.valueOf(sensorId).doubleValue))')おそらく動作します。 – assylias

+0

いいえ、動作していません。その質問を、「同等」が何を期待しているかを示すイメージで更新しました。 – Defozo

+1

Ha申し訳ありませんが速すぎます。メソッドのシグネチャを 'Field sensorIdTableField'を使用して変更できる場合は、問題を解決するはずです。 – assylias

答えて

2

を私はあなたに渡されるパラメータの種類を知っているように見える、特に以来、あなたのメソッドシグネチャで、より抽象型を使用することをお勧めします方法。その方法で、Jooqのタイプセーフティ機能を利用できます。

private Double getCalibrationFactor(String sensorId, 
            Field<Double> factor, 
            Table<?> PM, 
            Field<Integer> sensorIdTableField, 
            Field<Timestamp> timeFromWhichFactorIsUsed) { 
    Record1<Double> calibrationFactorAPM1 = Database.create 
       .select(factor) //CalibrationFactorPm1.CALIBRATION_FACTOR_PM1.FACTOR_A 
       .from(PM) //CalibrationFactorPm1.CALIBRATION_FACTOR_PM1 
       .where(sensorIdTableField.equal(Integer.valueOf(sensorId))) 
       .orderBy(timeFromWhichFactorIsUsed.desc()) 
       .fetchOne(); 
    return calibrationFactorAPM1 == null ? calibrationFactorAPM1.value1() : 1d; 
} 

また、代わりにString sensorIdInteger sensorIdを通過したいことがあります。

+0

'Type 'org.jooq.util.xml.jaxb.Tableに' Table PM'の 'type parameters'がなく、' sql() 'とは何ですか? – Defozo

+1

sorry()はDatabase.createでなければなりません。インポートは 'import org.jooq.Field; org.jooq.Tableをインポートする。 import org.jooq.Record1; ' – assylias

+0

ありがとう、それは今よく見えます。私はそれをテストします。 BTW私は警告を受け取ります: 'メソッド呼び出し 'value1'は' java.lang.NullPointerException''を '返す' return calibrationFactorAPM1 == null? calibrationFactorAPM1.value1():1d; ' – Defozo

関連する問題