Представление MySQL в файл CSV с использованием Java, Spring и Hibernate - PullRequest
2 голосов
/ 07 августа 2010

Меня попросили вывести файл CSV из представления в MySQL. Приложение, которое я сейчас пишу, использует Spring и Hibernate для создания базы данных, но представление мне только что передано.

Hibernate ничего не знает об этом представлении, но я бы хотел сделать что-то вроде этого:

public List<Object> getCsvView() {
  return (List<Object>) getHibernateTemplate().find("from myView");
}

Я предположил, что смог сопоставить собственный запрос, чтобы hibernate знал о представлении. Это немного сложно, когда я читаю документы:

Вы также можете сопоставить собственный запрос [...] с чтобы достичь этого, вам нужно описать Структура результирующего SQL с использованием @SqlResultSetMapping [...].

Теперь мне действительно не интересно отображать структуру результата. Я счастлив, что структура - это просто набор объектов.

Кроме того, они могут изменить это представление в любое время. Я действительно не в восторге от своего приложения, даже зная о представлении.

Итак, есть ли простой способ сделать это в мире Spring / Hibernate, или я решаю эту проблему?

1 Ответ

1 голос
/ 07 августа 2010

Просто выполните собственный запрос к представлению, и вы получите List из Object[] со скалярными значениями для каждого столбца в качестве результата. Из документации:

16.1.1. Скалярные запросы

Самый простой запрос SQL - это получить список скаляров (значений).

sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();

Они вернут список объектов массивы (Object[]) со скалярными значениями для каждого столбца в таблице CATS. Hibernate будет использовать ResultSetMetadata вывести фактический порядок и типы возвращенных скалярных значений.

Чтобы избежать накладных расходов на использование ResultSetMetadata, или просто быть более явно в том, что возвращается, один можно использовать addScalar():

sess.createSQLQuery("SELECT * FROM CATS")
 .addScalar("ID", Hibernate.LONG)
 .addScalar("NAME", Hibernate.STRING)
 .addScalar("BIRTHDATE", Hibernate.DATE)

Указан этот запрос:

  • строка запроса SQL
  • столбцы и типы для возврата

Это вернет массивы объектов, но сейчас не буду использовать ResultSetMetadata но будет вместо явно получить идентификатор, имя и BIRTHDATE столбец как соответственно Длинный, Струнный и Короткий от базовый набор результатов. Это также означает что только эти три столбца будут возвращается, даже если запрос используя * и может вернуть больше, чем три перечисленных столбца.

Можно не указывать тип информация для всех или некоторых из скаляры.

sess.createSQLQuery("SELECT * FROM CATS")
 .addScalar("ID", Hibernate.LONG)
 .addScalar("NAME")
 .addScalar("BIRTHDATE")

По сути, это тот же запрос, что и раньше, но сейчас ResultSetMetaData используется для определения типа ИМЯ и ДЕНЬ РОЖДЕНИЯ, где в качестве типа идентификатора явно указано.

Как java.sql.Types вернулся из ResultSetMetaData отображается на Типы гибернации контролируются Диалект. Если конкретный тип не отображается или не приводит к ожидаемый тип, можно настроить его с помощью звонков registerHibernateType в Dialect.

Отлично выглядит для создания файла CVS, ничего не зная о представлении:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...