【问题标题】:Sql select for complex classes复杂类的 Sql 选择
【发布时间】:2019-02-26 14:39:49
【问题描述】:

我在针对对象内的 List 情况进行选择语句时遇到问题。

假设我有如下所示的类:

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();

但我还希望将角色表的结果自动映射到用户列表。

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

【问题讨论】:

    标签: java sql oracle jdbctemplate


    【解决方案1】:

    您的数据库设计将包含两个代表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 问题。

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

    【讨论】:

    • 感谢您的帮助,“n+1 选择问题”正是我想要的。
    猜你喜欢
    • 2016-10-19
    • 2013-04-03
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多