|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Добрый день. С hibernate только разбираюсь, но остался в наследство довольно большой код, и потребовалось внести в него изменения. Есть сущность User Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Изначально в нем было только 2 поля - имя и фамилия. Потребовалось ввести новое поле - адрес. На эту сущность завязано довольно много запросов. Например, такого типа: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: plsql 1. 2. 3.
Этот запрос возвращает только имя и фамилию. Раньше все работало, но стоит добавить то самое поле address в User, как программа падает на строке users = usersQuery.getResultList(); с ошибкой invalid column name Можно ли как-то обозначить для хибернейта, что если в запросе нет результата для этого поля, то его не надо заполнять? Или есть какие-то другие обходные пути? К сожалению, User используется много где, и обойти все запросы и добавлять туда новое поле - довольно сложно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 11:07 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinПотребовалось ввести новое поле - адрес. На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:00 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
А ты само поле в таблицу то добавил? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:20 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
У тебя запрос хибер строит перечисляя все поля, что в сущности. А скл тупо ошибку даёт что такого поля нет. Потому что по ходу его действительно нет. Как правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь, лмбоо сам хибер если хбм2ддл у тебя стоит в режиме криейт (правда, тогда он будет у тебя базу дропать :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:27 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
andreykaTА ты само поле в таблицу то добавил?непонятно какое поле. Если один адрес то это string. Если много, то это id. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:30 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
andreykaTКак правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь,разумеется перед правкой кода поле в бд должно быть. Только из за этого вся фигня что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:32 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Petro123TimeinПотребовалось ввести новое поле - адрес. На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц? Это не сущность. Я, скорее всего, неправильно выразился. Как таковой таблицы User в базе нет. Есть процедура search.search_user, которая джойнит несколько таблиц и возвращает результат, который уже потом маппится на сущность User (с аннотацией @Entity, кстати, мог промахнуться. Код сейчас воспроизводил по памяти, под рукой нет) Соответственно, search.search_user - это старая процедура, которая знать ничего не знает про поле address и возвращает ровно два значения (имя и фамилию). Вот тут и возникает проблема. Проблема в том, что поле adress надо добавить для другого запроса. Но как только я добавляю address в класс, я ломаю весь старый код, который когда-то получал заполненный User из базы ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:41 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinЭто не сущность. Я, скорее всего, неправильно выразился. Как таковой таблицы User в базе нет. Есть процедура search.search_user, которая джойнит несколько таблиц и возвращает результат, который уже потом маппится на сущность User (с аннотацией @Entity, кстати, мог промахнуться. Код сейчас воспроизводил по памяти, под рукой нет) Круто ты. Сущность, не сущность. У сущности таблицы нет. Разбирайся там, т.к. Хибер так не работает... Если его не ставить раком. Название темы означает показ Сущности и маппинга РЕАЛЬНОГО. А также бд РЕАЛЬНОЙ. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:49 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Увидел что из хранимки)) andreykaT тогда прав. Смотри наличие поля. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:55 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinСоответственно, search.search_user - это старая процедура, которая знать ничего не знает про поле address и возвращает ровно два значения (имя и фамилию). Вот тут и возникает проблема.хранимка? Добавить туда поле, либо рядом другую либо join уже в java. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:58 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Timeinломаю весь старый кодникогда не используй звездочки select * ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 12:59 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Petro123хранимка? Добавить туда поле, либо рядом другую либо join уже в java. Добавить конкретно сюда - не проблема. Но я уже писал выше, что таких запросов много. И перерывать весь код, а так же добавлять по сути пустое значение (в тех местах адрес не нужен), несколько проблематично. Потому и спросил, нет ли какого-то более простого решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 13:05 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Timein, Если бы говнокодеры не ставили раньше звезд проблема решена? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 13:17 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Petro123Timein, Если бы говнокодеры не ставили раньше звезд проблема решена? Честно говоря, не очень вас понял. Вы имеете в виду, что если бы изначально запрос был написан так? Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 13:28 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinPetro123Timein, Если бы говнокодеры не ставили раньше звезд проблема решена? Честно говоря, не очень вас понял. Вы имеете в виду, что если бы изначально запрос был написан так? Код: plsql 1.
ну да. Гугл весь пестрит мессагами что звёздочка - зло. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 13:48 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Petro123, к сожалению, так тоже не работает. При таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 13:57 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinПри таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию не верю. 1. Запусти это не в Java, а в СУБД при добавленном новом поле в ХП select name, lastname from table(search.search_user(p_name=>:p_name)) Работает? Тогда 2. БЕЗ добавки в класс поля проверить что работает в Java. Работает? Тогда 3. Только в нужном месте сделать class UserAndAdress с допПолем ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 14:07 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Petro123, Еще раз обозначу, что я пытаюсь добиться: добавить в класс User новое поле + не менять старые запросы (максимум, заменить * на поля) Сейчас поднял старый какой-то проект, попытался на нем. Вместо хранимой процедуры использовал существующую в базе таблицу в которой поля адрес нет Код: 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. 43. 44. 45. 46. 47. 48. 49.
Код: java 1. 2. 3.
Соответственно, без address все работает, с address Caused by: org.hibernate.exception.GenericJDBCException: could not execute query at org.hibernate.dialect.SQLiteSQLExceptionConversionDelegate.convert(SQLiteSQLExceptionConversionDelegate.java:48) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.loader.Loader.doList(Loader.java:2557) at org.hibernate.loader.Loader.doList(Loader.java:2540) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) at org.hibernate.loader.Loader.list(Loader.java:2365) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353) at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1909) at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311) at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141) at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449) ... 1 more Caused by: java.sql.SQLException: no such column: 'address' Похоже, отделаться малой кровью не удастся и действительно придется создавать отдельный класс, с разницей в одно поле ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 14:34 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
TimeinЕще раз обозначу, что я пытаюсь добиться: добавить в класс User новое поле + не менять старые запросы (максимум, заменить * на поля) либо другой класс, либо ищи где звезда или старый класс без поля. Чудес не бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 14:39 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
Timein[src java] @Entity @NamedNativeQuery( name = "User.findAllUser", query = "SELECT user_Id, name, lastName FROM sameTable", resultClass = User.class ) Это же не SQL нифига, а JPQL, соответственно если выбираете "сущность", то там все поля должны быть, или выбирайте что-то другое, Tuple или Object[] ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 15:54 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
вы че стебетесь чтоле все? ТС добавь поле lastName в свою таблицу наконец. скажем так: alter table "user" add column lastName varchar(255) ну или типа того че там сто лет скулем не пользовался. еще раз. хибер делает запрос где перечисляет все поля (все три поля в твоем случае) и конечно же скуэл его обламывает потому что поля нет. даже если ТЫ не делаешь такого запроса - это не значит что хибер его не делает где-нибудь без тебя. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 18:31 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
andreykaT, да он не слышит ни тебя и меня. Я ему п.п. 1, а он ноль реакции автор1. Запусти это не в Java, а в СУБД при добавленном новом поле в ХП select name, lastname from table(search.search_user(p_name=>:p_name)) Работает? авторЕще раз обозначу, что я пытаюсь добиться: ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 21:27 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
а... ну тогда окей ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 22:47 |
|
hibernate маппинг полей
|
|||
---|---|---|---|
#18+
andreykaTвы че стебетесь чтоле все? ТС добавь поле lastName в свою таблицу наконец. скажем так: alter table "user" add column lastName varchar(255) ну или типа того че там сто лет скулем не пользовался. еще раз. хибер делает запрос где перечисляет все поля (все три поля в твоем случае) и конечно же скуэл его обламывает потому что поля нет. даже если ТЫ не делаешь такого запроса - это не значит что хибер его не делает где-нибудь без тебя. Я вот тоже, честно говоря, не знаю, чем вы читаете. Нет никакой таблицы. Есть процедура, которая возвращает значения. И я, по-моему, и уже писал, что мне не проблема в нее добавить вывод этого поля. НО! Есть куча nativeQuery, которые использует класс без нового поля и этот код падает с классом с новым полем. Ровно потому что хибернейт ждет и там это поле. В этом и состоял вопрос можно ли обойти исправление всего sqlного кода, если добавить новое поле. А вы мне упорно твердите: добавь новое поле. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2018, 22:50 |
|
|
start [/forum/topic.php?fid=59&msg=39730988&tid=2121664]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 163ms |
0 / 0 |