Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将列和表传递给函数?_Java_Database_Postgresql_Function_Jooq - Fatal编程技术网

Java 如何将列和表传递给函数?

Java 如何将列和表传递给函数?,java,database,postgresql,function,jooq,Java,Database,Postgresql,Function,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 ) 因为会有一些其他的表,比如这个表,我想做一个函数,我可以向它传

在我的数据库中,我有一个表:

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)的信息

我试着这样做:

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();
        }
    }
private Double getCalibrationFactor(字符串传感器ID、表字段系数、表impl PM、表字段传感器ID表字段、表字段时间,使用该系数){
双重校准系数Rapm1=1.0;
试一试{
calibrationFactorAPM1=Double.valueOf(Database.create
.选择(系数)//校准系数PM1.CALIBRATION\u factor\u PM1.factor\u A
.from(PM)//CalibrationFactorPm1.CALIBRATION\u FACTOR\u PM1
.where(sensorIdTableField.equal(Integer.valueOf(sensorId)))
.orderBy(timeFromWhichFactorIsUsed.desc())
.fetchOne()
.getValue(0)
.toString());
}捕获(NullPointerException e){
System.out.println(“调试:找不到此传感器的校准系数'a”);
e、 printStackTrace();
}
}
但是,我在
.where(sensorIdTableField.equal(Integer.valueOf(sensorId))
行上得到
无法解析方法'equal(java.lang.Integer)

如何正确处理这个问题

@编辑

这就是equal()所期望的:

我建议在方法签名中使用更多的抽象类型,特别是因为您似乎知道传递给方法的参数的类型。这样,您就可以从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;
}
专用双getCalibrationFactor(字符串传感器ID,
场因子,
下午二时,
现场传感器IDTableField,
字段时间(使用的因素){
Record1 calibrationFactorAPM1=Database.create
.选择(系数)//校准系数PM1.CALIBRATION\u factor\u PM1.factor\u A
.from(PM)//CalibrationFactorPm1.CALIBRATION\u FACTOR\u PM1
.where(sensorIdTableField.equal(Integer.valueOf(sensorId)))
.orderBy(timeFromWhichFactorIsUsed.desc())
.fetchOne();
返回calibrationFactorAPM1==null?calibrationFactorAPM1.value1():1d;
}

您可能还希望传递一个
整数sensorId
而不是
字符串sensorId
我建议在方法签名中使用更多的抽象类型,特别是因为您似乎知道传递给方法的参数的类型。这样,您就可以从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;
}
专用双getCalibrationFactor(字符串传感器ID,
场因子,
下午二时,
现场传感器IDTableField,
字段时间(使用的因素){
Record1 calibrationFactorAPM1=Database.create
.选择(系数)//校准系数PM1.CALIBRATION\u factor\u PM1.factor\u A
.from(PM)//CalibrationFactorPm1.CALIBRATION\u FACTOR\u PM1
.where(sensorIdTableField.equal(Integer.valueOf(sensorId)))
.orderBy(timeFromWhichFactorIsUsed.desc())
.fetchOne();
返回calibrationFactorAPM1==null?calibrationFactorAPM1.value1():1d;
}


您可能还希望传递一个
整数sensorId
而不是
字符串sensorId

考虑到您的架构,我怀疑
equal
需要一个
双精度
,而不是
整数
sensorIdTableField.equal(Integer.valueOf(sensorId.doubleValue))
可能会起作用。不,它不起作用。用显示
equal
期望值的图像更新了问题。抱歉,我读得太快了-如果您可以将方法的签名更改为使用
Field sensorIdTableField
,应该可以解决问题。谢谢!它解决了这一行的问题,但现在我在
.orderBy(timeFromWhichFactorIsUsed.desc())
行上得到了
无法解决方法“orderBy(org.jooq.SortField)
的问题。我已经发布了一个答案,应该也解决了这个新问题。考虑到您的模式,我怀疑
equal
需要一个
,不是
整数
sensorIdTableField.equal(Integer.valueOf(sensorId.doubleValue))
可能会起作用。不,它不起作用。用显示
equal
期望值的图像更新了问题。抱歉,我读得太快了-如果您可以将方法的签名更改为使用
Field sensorIdTableField
,应该可以解决问题。谢谢!它解决了这一行的问题,但现在我在
.orderBy(timeFromWhichFactorIsUsed.desc())上得到
无法解析方法'orderBy(org.jooq.SortField)
line。我已经发布了一个答案,应该也解决了这个新问题。我得到的
Type'org.jooq.util.xml.jaxb.Table'在
Table PM
上没有类型参数
,什么是
sql()
?对不起,sql()应该是Database.create。导入应为
import org.jooq.Field;导入org.jooq.Table;导入org.jooq.Record1谢谢,现在看起来不错。我来测试一下。顺便说一句,我得到一个警告:
方法调用'value1'可能会在
返回校准factorapm1==null行上产生'java.lang.NullPointerException'
?校准系数1m1.value1():1d
@Defozo如果您的DB列具有NOTNULL约束,则不会发生这种情况,但您应该能够通过将
1d
更改为
Double.valueOf(1d)
来消除警告<代码>返回校准系数RAPM1!=null…
和not
返回校准factorapm1==null…
。。。周五晚上…我得到
类型“org.jooq.util.xml.jaxb.Table”在
表PM上没有类型参数
,什么是
sql()<