Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
some_name
Вежливость-главное оружие
227 / 225 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
1

Jdbc One to many. Как извлечь данные за один запрос?

20.02.2015, 22:33. Просмотров 1052. Ответов 4
Метки нет (Все метки)

Здравствуйте!

У меня имеется вот такя MySql БД:
Кликните здесь для просмотра всего текста

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE `nationalities` (
  `nationality_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nationality_value` VARCHAR(5) NOT NULL,
  PRIMARY KEY (`nationality_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
CREATE TABLE `contacts` (
  `contact_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `first_name` VARCHAR(30) NOT NULL,  
  `nationality_id` INT(11) NOT NULL,   
  PRIMARY KEY (`contact_id`),
  KEY `nationality_id` (`nationality_id`),
  CONSTRAINT `contacts_ibfk_1` FOREIGN KEY (`contact_id`) REFERENCES `nationalities` (`nationality_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `emails`(
  `contact_id` INT(11) UNSIGNED NOT NULL,
  `email_value` VARCHAR(30),
  CONSTRAINT FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`contact_id`) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `phones`(
  `contact_id` INT(11) UNSIGNED NOT NULL,
  `phone_value` VARCHAR(30),
  `phone_type` CHAR(1),
  CONSTRAINT FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`contact_id`) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;



Отношения:

nationalities (1) - (*) contacts
contacts(1) - (*) emails
contacts(1) - (*) phones


Возможно ли, выполнив такой запрос:
Кликните здесь для просмотра всего текста

SQL
1
2
3
4
5
6
7
private static final String GET_QUERY = 
            "SELECT contact_id, first_name, "+
                   "phone_value, phone_type, nationality_value, email_value, " +                  
            "JOIN contacts.nationality_id = nationalities.nationality_id ON nationalities " +
            "JOIN contacts.contact_id = phones.contact_id ON contacts " +
            "JOIN contacts.contact_id = emails.contact_id ON contacts " +
            "FROM contacts";


Упаковать все вот в такую сущность:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
public class Contact {
    private long id;
    private String firstName;    
    private String nationality;
    private List<Phone> phones;
    private List<Email> emails;
      .......
}


Здесь пишут, что можно при помощи RowCallbackHandler и ResultSetExtractor, но это уже Spring. А я хочу при помощи "голого" Jdbc.

Возможно ли это сделать?

Заранее спс!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2015, 22:33
Ответы с готовыми решениями:

ASP GridView как извлечь данные определенные данные из выбранной строки
Ключевое поле извлекается легко (int ID =...

Как извлечь данные из сервера Parse, чтобы эти данные были видны всем?
У меня есть активити, где есть строка, куда вводишь данные и они отправляются...

Обновить данные за один запрос
Вот к примеру делаем запрос на обновление записи. Нужно прибавить единицу к...

Как извлечь один файл из архива rar?
Здравствуйте! Есть ли возможность извлечь один файл из архива rar, нигде такой...

Как извлечь данные из БД
Здравствуйте! Помогите пожалуйста, я новичок в php программирования. Как можно...

4
snajper_ro
103 / 88 / 51
Регистрация: 14.09.2011
Сообщений: 568
Записей в блоге: 1
21.02.2015, 12:33 2
Лучший ответ Сообщение было отмечено some_name как решение

Решение

Насколько я знаю это пойдет как стандартный запрос, select, и потом parse по объектам.Хотя со несколькими объектами работать на одном кортеже надо посмотреть на jdbс ,а лучше узнать, это запустить запрос!
0
some_name
Вежливость-главное оружие
227 / 225 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
21.02.2015, 22:00  [ТС] 3
snajper_ro, да, так оно и вышло:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static Contact readFullContactFrom(ResultSet resultSet)
            throws SQLException {
        if (resultSet.isBeforeFirst()) {
            resultSet.next();
        }
        if (resultSet.isAfterLast()) {
            return null;
        }
        Map<Long, Phone> phonesId = new HashMap<Long, Phone>();
        Map<Long, Email> emailsId = new HashMap<Long, Email>();
        Contact contact = null;
        long contactId = resultSet.getLong("contacts.contact_id");
        do {
            long id = resultSet.getLong("contacts.contact_id");
            if ((contactId == id)) {
                contact = new Contact();
                readMostPartTo(resultSet, contact);
                readSmallPartTo(resultSet, contact);
            } else {
                break;
            }
 
            long phoneId = resultSet.getLong("phone_id");
            if (phonesId.get(phoneId) == null) {
                Phone phone = new Phone();
                readTo(resultSet, phone);
                phonesId.put(phoneId, phone);
            }
 
            long emailId = resultSet.getLong("email_id");
            if (emailsId.get(emailId) == null) {
                Email email = new Email();
                readTo(resultSet, email);
                emailsId.put(emailId, email);
            }
        } while (resultSet.next());
 
        contact.setPhones(new ArrayList<Phone>(phonesId.values()));
        contact.setEmails(new ArrayList<Email>(emailsId.values()));
 
        return contact;
    }

З.Ы Это не весь код. Но идея думаю понятна.

З.Ы.Ы Еще вопросик имеется.

Вот согласно sql-скрипту выше, если мне нужно изменить запись в таблице 'contacts', то мне нужно вручную в каждую таблицу ложить обновленные данные или часть работы может за меня сервер сделать?
0
snajper_ro
103 / 88 / 51
Регистрация: 14.09.2011
Сообщений: 568
Записей в блоге: 1
21.02.2015, 22:30 4
Если вы реализуете crud , и много таблиц, то лучше уже юзануть hibernate . А так в ручную все надо подгонять.
0
some_name
Вежливость-главное оружие
227 / 225 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
21.02.2015, 22:41  [ТС] 5
Hibernate нельзя. Нужно "голый" Jdbc.

Т.е. если таблицы связаны по 'id', то от CASCADE UPDATE толку 0.
0
21.02.2015, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2015, 22:41

Как извлечь данные из БД
Я не имею знаний в mysql. Прошу совета. Задача такова: на хостинге в...

ajax на один и тот же запрос приходят разные данные
просто переходя по адресу http://vta.aws.krysalix.com/users/remotecurrent,...

Запросить все данные, указанные в фильтрах, в один запрос
есть запрос к БД кратко о запросе... Нужно запросить все данные указанные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru