0

Возможно ли такое, в принципе? Допустим, у нас есть таблица, содержащая четыре поля id, name, birthday, age. Класс Entity Integer id, String name, Date birthday, Integer age, поля которого помечены соответствующими аннотациями. Но если мы в запросе делаем SELECT, только по name, возможно ли отобразить его на класс Entity и как это сделать?

  • Есть способы. Вам зачем? – Sergey Gornostaev Nov 13 '17 at 16:55
  • @SergeyGornostaev чтобы не менять архитектуру приложения, не писать новые классы-сущности. – Vasiliy Pumpkin Nov 13 '17 at 16:59
  • Оригинально! А вам ORM точно нужен? – Sergey Gornostaev Nov 13 '17 at 17:02
  • @SergeyGornostaev Ага, то есть есть уже готовое приложение, оно очень большое. У него есть уже свои классы и интерфейсы, ссылки типа которых можно передать в качестве параметров в различные методы (то есть свой api). И данные из таблиц (но не все), соответственно, нужно отобразить на эти классы, чтобы не вносить серьёзные изменения в код. Не могли бы вы привести ссылки, примеры, где можно почить как это можно сделать или ответить здесь? – Vasiliy Pumpkin Nov 13 '17 at 17:10
  • В этой ситуации не вижу способа более простого, чем исправление сущностей. – Sergey Gornostaev Nov 13 '17 at 17:16
  • Похоже на преждевременную оптимизацию. Если в результате выборки возвращается менее сотни записей, то большого значения не имеет 4 поля будут считаны или одно, по крайней мере если такие запросы выполняются реже 10 раз в секунду: просто берите самую легкую сущность и всё. К тому же, похоже на попытку получить ответ на изначально неправильно поставленный вопрос: вы уже приняли решение и спрашиваете как его реализовать, но далеко не факт что это решение верное - опишите решаемую задачу – bobzer Nov 14 '17 at 05:09
  • @bobzer , да, верно, решение уже принято и возможно вопрос неправильно поставлен. Правильная постановка: как реализовать?). Решаемая задача - есть бд, нужно сделать "снимок" некоторых её таблиц и передать на другое устройство в формате json. Для этого нужно использовать hibernate и готовые сущности. – Vasiliy Pumpkin Nov 14 '17 at 07:44

1 Answers1

2

"нужно использовать hibernate и готовые сущности" - hibernate можно использовать и без сущностей: запрос select name from User вернёт список Object-ов (List<Object> - при выборке одного поля, List<Object[]> - при выборке нескольких полей), содержащих значение поля name. Можно использовать HQL указав имя класса сущности и вызвав метод createQuery: SELECT name FROM User. Можно использовать SQL указав имя таблицы и вызвав метод createNativeQuery: SELECT name_field FROM users_table.

Если без сущностей никак не обойтись, то добавьте в сущность конструктор без параметров и конструктор с параметром String name, и выполните запрос select new User(name) from User. В результате получите список экземпляров сущности, у которой объявлено несколько полей, но непустое поле только одно - name.

//конструктор без параметров нужен для соответствия спецификациям
public User() {
}

//конструктор для вашего HQL-запроса
public User(String name) {
  this.name = name;
}
bobzer
  • 2,247
  • Спасибо, я бы проголосовал за Ваш ответ, если бы мог) Он, действительно полезен, в части того, что hibernate можно использовать без сущностей. Но в таком случае, нужно использовать createNativeQuery? – Vasiliy Pumpkin Nov 14 '17 at 11:57
  • @VasiliyPumpkin нет, в ответе используется HQL. – Sergey Gornostaev Nov 14 '17 at 12:01
  • @Sergey Gornostaev , в первой части ответа, думаю, это возможно. Во второй, есть уже сущность User. – Vasiliy Pumpkin Nov 14 '17 at 12:10
  • я дополнил ответ: в первом варианте можно использовать и HQL и SQL, во втором - только HQL – bobzer Nov 14 '17 at 15:55