Sql select 复杂 类

Sql select for complex classes

我在针对对象中包含 List 的情况创建 select 语句时遇到问题。

假设我 类 看起来像这样:

public Class Role {
    private Integer id;
    private String name;
}
public Class User {
    private String login;
    private String password;
    private List<Role> roles;
}

当然也有 getter 和 setter。

我正在处理需要使用 JdbcTemplate 从数据库中查询对象的项目,但我们没有 ORM。

所以这里有一个问题:是否可以做出这样的 SQL Select 声明,即在 JDBC 模板的自动映射器之外不使用任何映射器?

我可以在 java 代码中做这样的事情:

List<User> users = sqlManager.createQuery("SELECT login, password FROM users", 
                                          User.class).getResultList();

但我还想要角色 table 的结果,以便将用户自动映射到用户列表。

顺便说一句,这只是示例,我正在处理更复杂的对象。

您的数据库设计将包含两个主要的 table 代表 userrole 以及一个辅助 table 代表它们之间的 m:n 关系.

create table  User_tab (
    login varchar2(100),
    password_hash raw(100), 
    CONSTRAINT User_tab_pk PRIMARY KEY (login)
);

create table Role_tab (
    id Int,
    name varchar2(100),
    CONSTRAINT Role_tab_pk PRIMARY KEY (id)
); 

create table User_Role_tab (
    login varchar2(100),
    id Int,
    CONSTRAINT User_Role_tab_pk PRIMARY KEY (login,id),
    CONSTRAINT User_Tab_fk FOREIGN KEY (login) REFERENCES User_tab(login),
    CONSTRAINT Role_tab_fk FOREIGN KEY (id) REFERENCES Role_tab(id)    
);

因此,要获取特定用户的角色列表,您将使用此查询

select id from User_Role_tab where login = ?

请注意,您对缺少 ORM.

中的问题的识别是正确的

但另请注意,使用您的方法,您实际上会尝试 重新实现 ORM 以解决或导致 的所有问题。检查例如n+1 select 问题。

所以如果你的方法可行,你应该做一些初步评估。