Sql выбрать для сложных классов - PullRequest
0 голосов
/ 25 февраля 2019

У меня проблема с созданием оператора select для ситуации со списком внутри объекта.

Допустим, у меня есть классы, которые выглядят так:

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

Но я хочу такжерезультат из таблицы ролей для этих пользователей, которые будут автоматически включены в список пользователей

Кстати, это только пример, я работаю с гораздо более сложным объектом.

1 Ответ

0 голосов
/ 26 февраля 2019

Ваш дизайн БД будет состоять из двух основных таблиц, представляющих user и role, и вспомогательной таблицы, представляющей отношение 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 проблемы.

Так что вы должны сделать некоторую первоначальную оценку, если ваша оценка осуществима.

...