SQL选择复杂的类

时间:2019-02-25 16:56:47

标签: java sql oracle jdbctemplate

我无法针对对象内部的List做出选择语句。

比方说,我有这样的类:

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

当然也有吸气剂和吸气剂。

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

所以这是一个问题:是否有可能做出这样的SQL Select语句,即在JDBC模板的自动映射器之外,将没有映射器用于该映射器?

我可以在Java代码中执行以下操作:

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

但是我还希望角色表中的结果可以使该用户自动映射到用户列表。

btw仅仅是一个例子,我正在处理更复杂的对象。

1 个答案:

答案 0 :(得分:0)

您的数据库设计将由代表userrole的两个主表以及代表它们之间的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问题。

因此,如果您的方法可行,则应进行一些初步评估。