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 代表 user
和 role
以及一个辅助 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
问题。
所以如果你的方法可行,你应该做一些初步评估。
我在针对对象中包含 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 代表 user
和 role
以及一个辅助 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
问题。
所以如果你的方法可行,你应该做一些初步评估。