java—使用jdbc在一对多中获取“多”

hwamh0ep  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(350)

我现在有两张table,它们形成了一对多的关系。一个餐厅的table,它Map到多个检查。我的postgres表定义如下:

CREATE TABLE restaurant (
    id UUID NOT NULL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    zip VARCHAR(255),
    address VARCHAR(255),
    phone VARCHAR(255)
);

CREATE TABLE inspection (
    restaurant_id UUID NOT NULL,
    date VARCHAR(255) NOT NULL,
    score int,
    violation VARCHAR(255),
    risk VARCHAR(255),
    FOREIGN KEY (restaurant_id) REFERENCES restaurant(id)
);

当我询问一家餐馆时,我不知道如何推断所有的检查结果。我正在用电脑把餐厅的所有地方都弄到手 resultSet.getString("fieldName") ,但我尝试时它不起作用 resultSet.getString("inspection") . 我需要什么代码来进行这些检查?这是我目前查询的所有餐厅。

@Override
    public Optional<Restaurant> selectRestaurantById(UUID id) {
        final String sql = "SELECT * FROM restaurant WHERE id = ?"; 
        List<Restaurant> res = jdbcTemplate.query(
                sql, 
                new Object[] {id}, 
                (resultSet, i) -> {
            UUID restaurant_id = UUID.fromString(resultSet.getString("id"));
            String name = resultSet.getString("name");
            String zip = resultSet.getString("zip");
            String address = resultSet.getString("address");
            String phone = resultSet.getString("phone");

            // How do I get an ArrayList of inspections from postgres??
            Restaurant r = new Restaurant(restaurant_id, name, zip, address, phone);
            return r;
        });
        Restaurant found = res.size() > 0 ? res.get(0) : null;
        return Optional.ofNullable(found);
    }
9vw9lbht

9vw9lbht1#

它与java或jdbc无关。启动一个基本的sql终端(如果你使用postgres, psql ,在终端上,这样做很好)并首先学习sql。幸运的是,网上有很多教程:)
查询只生成另一个表,然后循环遍历。 SELECT * FROM foo 只是。。把那张table给你。还有那张table,小心。餐厅的table就在那里。餐厅。里面没有可供检查的地方。 FOREIGN KEY 不是魔术,sql也没有真正的一对多关系的概念。至少,不是这样定义的——它们有连接的概念,可以让你在你想要的任何东西之间临时定义这样的关系。不需要一个 FOREIGN KEY 在定义中。
所有这些 FOREIGN KEY 是的,就是对db说:你能为这个字段建立一个索引吗?如果有任何事务会将一行“restaurant\u id”字段的值与restaurant表中某行的“id”值不匹配,请将其写入这个表中,那么请失败。这和 CHECK v > 0 会的。只是在提交时运行的检查。这就是全部。 SELECT r.*, i.* FROM restaurant r LEFT JOIN inspection i ON i.restaurant_id = r.id WHERE r.id = ? 可以说,这就是一张新的“table”。包含行中的每一列和检查中的每一列。如果一家餐厅有0次检查,你会得到1排,每排 i. 相关字段为空(因为左连接;如果你写了“内部连接”,你就不会有那些餐馆了)。对于一家有10次检查的餐厅,你会得到10排 r. 相关字段重复。
如果这听起来很烦人-是的,我看得出来。然后运行第二个查询: SELECT * FROM inspection WHERE restaurant_id = ? ,获取数据,填写数组列表。
注意:你的table很奇怪。 score 应该有一个 NOT NULL 限制。

相关问题