値を取得しようとしているテーブルではなく、別のテーブルの列から値が移入されています。同じ名前のJDBC複数の列
mySQLからは、nullの結果が得られます。しかし、プログラム内からは、値を表示しています(その行に1つ与えた場合)。または、別のテーブルの値を表示しています。これはエイリアスを使用して、どのテーブルから引き出すべきかを明示的に述べている間でさえあります。
私はデバイステーブルとデバイスタイプテーブルを持っています。デバイステーブルにはデバイスと同じフィールドがすべてありますが、必要なフィールドを指定するのは1と0だけです。
これは、両方のテーブルの値がINT
の場合、resultSet.getInt("column_with_issue")
を使用する場合にのみ発生します。これは、デバイスの編集/作成GUIフォームを生成するときに使用されます。型が異なる限り、resultSet.getString("column_with_no_issues")
を実行すると、適切なnullが返されます。
これは私の元のクエリであり、修正するために提案ごとに変更しようとしたものです。
SELECT d.*, dt.type, os.os_name FROM device d inner join device_type dt on d.type_id = dt.id left outer join operating_system os on d.os = os.id
WHERE d.division_number = 1 or 1
AND (d.asset_tag = 1 or 1)
AND (dt.type = 1 or 1);
他の人のstackoverflow/javaranchの質問に記載されているような修正が可能です。これにより、各特定の列に独自の名前が付けられます。しかし、たとえ私が(2つの異なる変数タイプを持つ例として)dwireless
から引き出す場合でも、予想されるヌル値ではなく、その種のデバイスのために私のdevice_type.wireless
からの整数値を得ます。
SELECT d.id as did, d.division_number as ddivision_number, d.current_location as dcurrent_location, d.type_id as dtype_id, d.model as dmodel, d.asset_tag as dasset_tag, d.serial_number as dserial_number, d.manufacture_date as dmanufacture_date, d.screen as dscreen, d.os as dos, d.users_name as dusers_name, d.office_installed as doffice_installed, d.memory as dmemory, d.series as dseries, d.ip_address as dip_address, d.host_name as dhostname, d.vm_host as dvm_host, d.processor as dprocessor, d.wireless as dwireless, d.purchase_quality as dpurchase_quality, d.purchase_price as dpurchase_price, d.active as dactive, d.notes as dnotes, dt.type, os.os_name
FROM device d inner join device_type dt on d.type_id = dt.id left outer join operating_system os on d.os = os.id
WHERE d.division_number = 1 or 1
AND (d.asset_tag = 1 or 1)
AND (dt.type = 1 or 1);
ここでは、結果セットから変数を取得するために使用しているJavaコードを示します。
private ObservableList<Device> getDevices(String sqlStatement) throws SQLException {
ObservableList<Device> devices = FXCollections.observableArrayList();
// Run the query to select all of our devices.
Statement searchDeviceStatement = Main.myConn.createStatement();
ResultSet rs = searchDeviceStatement.executeQuery(sqlStatement);
// Add all of our devices into our array list to be displayed.
// These are the actual columns of the database.
while (rs.next()) {
devices.add(new Device(rs.getInt("did"), rs.getInt("ddivision_number"), rs.getInt("dtype_id"),
rs.getString("type"), rs.getString("dmodel"), rs.getInt("dasset_tag"), rs.getString("dserial_number"),
rs.getInt("dmanufacture_date"), rs.getString("dscreen"), rs.getInt("dos"), rs.getString("os_name"),
rs.getString("dusers_name"), rs.getInt("doffice_installed"), rs.getString("dmemory"),
rs.getString("dseries"), rs.getString("dip_address"), rs.getString("dhost_name"),
rs.getString("dvm_host"), rs.getString("dprocessor"), rs.getInt("dwireless"),
rs.getString("dpurchase_quality"), rs.getDouble("dpurchase_price"), rs.getInt("dactive"), rs.getString("dnotes")));
}
return devices;
}
MySQLのワークベンチから意図したとおりにhere見られるようにクエリは、動作しますが、私のプログラムでデータを表示するときには、this.