Возможно ли такое, в принципе? Допустим, у нас есть таблица, содержащая четыре поля 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 Answers
"нужно использовать 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;
}
- 2,247
-
Спасибо, я бы проголосовал за Ваш ответ, если бы мог) Он, действительно полезен, в части того, что hibernate можно использовать без сущностей. Но в таком случае, нужно использовать createNativeQuery? – Vasiliy Pumpkin Nov 14 '17 at 11:57
-
-
@Sergey Gornostaev , в первой части ответа, думаю, это возможно. Во второй, есть уже сущность User. – Vasiliy Pumpkin Nov 14 '17 at 12:10
-
я дополнил ответ: в первом варианте можно использовать и HQL и SQL, во втором - только HQL – bobzer Nov 14 '17 at 15:55