|
|
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть код, который при считывании данных автоматически не грузит удалённые. Упрощённо так: Код: java 1. 2. 3. 4. И есть сущность (Child), у которой нет своего признака "удалён", а есть parent у которого isDeleted. Хочется, чтобы фильтрация добавилась автоматом. Идея такая- я как-то добавляю в поля класса Child нечто, что не требует поля в БД (долго добавлять), но при этом в classMetadata оно как-то попадёт. Так, естественно не работает: Код: java 1. 2. 3. 4. 5. В общем-то можно сделать и подругому, но хочется (ради красоты и простоты изменения): - не менять структуру БД - не вводить никаких "если это класс Child то добавим-ка фильтр..." -- Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2016, 09:25 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию? Насколько я знаю, язык HQL это позволяет. Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2016, 09:54 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
SQL2008Alexey Tomin, а нельзя добавить в queryString условие обрабатывающее эту ситуацию? Насколько я знаю, язык HQL это позволяет. Или это идет вразрез с вашим пожеланием "- не вводить никаких "если это класс Child то добавим-ка фильтр..."? Да, именно что можно добавить (и добавил для теста), но выглядит это костыльно. Класс, который добавляет условия, не знает про специальные случаи. Пришлось добавить мапу specialFilterOfDeletedMap и снаружи инициализировать её (тот, снаружи, знает при специфичные особенности сущностей). Т.е. совсем г@внокода нет, но всё одно, как-то не радует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2016, 10:07 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey TominДа, именно что можно добавить (и добавил для теста), но выглядит это костыльно. Класс, который добавляет условия, не знает про специальные случаи. Пришлось добавить мапу specialFilterOfDeletedMap и снаружи инициализировать её (тот, снаружи, знает при специфичные особенности сущностей). Т.е. совсем г@внокода нет, но всё одно, как-то не радует. Можно. Только не ч/з @Column. 1) Код: java 1. 2. 2) Код: java 1. 2. 3. 4. Где-то так :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2016, 11:43 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
mad_nazgul1) Код: java 1. 2. 2) Код: java 1. 2. 3. 4. Где-то так :-) Не выходит... 1. metadata.getPropertyNames() не содержит isDeleted или deleted 2. при попытке добавить where isDeleted = false (или deleted) - ошибка "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'deleted' in 'where clause'" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 11:38 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey TominНе выходит... 1. metadata.getPropertyNames() не содержит isDeleted или deleted 2. при попытке добавить where isDeleted = false (или deleted) - ошибка "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'deleted' in 'where clause'" Попробуйте включить отображение какие запросы генерит Hibernate. По идее должно работать, т.к. 1) EAGER - задает, чтобы при загрузки сущности сразу грузился объект Parent 2) Аннотация @Transient говорит, что бы EntityManager не воспринимал поле как колонку таблицы. Может у вас в Parent нет поля deleted? Или оно как-то по другому называется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 12:25 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
mad_nazgulМожет у вас в Parent нет поля deleted? Или оно как-то по другому называется? Есть. Добавленное несколько криво "where parent.deleted = false" работает, а правильно "where deleted = false" - нет. А вообще я не понимаю, как может попасть @Transient поле может попасть в парсер HQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 13:35 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey Tominmad_nazgulМожет у вас в Parent нет поля deleted? Или оно как-то по другому называется? Есть. Добавленное несколько криво "where parent.deleted = false" работает, а правильно "where deleted = false" - нет. А вообще я не понимаю, как может попасть @Transient поле может попасть в парсер HQL Согласен что-то странное. parent.getIsDeleted() - оно вообще должно отрабатывать после запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 14:16 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
А не могут быть такие странности из-за области видимости свойств и методов объектов - public, private? Например, в с++ это вполне возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 15:28 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
mad_nazgulСогласен что-то странное. parent.getIsDeleted() - оно вообще должно отрабатывать после запроса. Именно что. А мне надо до запроса. При этом надо как-то объяснить hibernate, что надо так вот извернутся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2016, 16:45 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey Tominmad_nazgulСогласен что-то странное. parent.getIsDeleted() - оно вообще должно отрабатывать после запроса. Именно что. А мне надо до запроса. При этом надо как-то объяснить hibernate, что надо так вот извернутся. Э-э-э чта?! Hibernate все таки детерминированный фреймворк, а не квантовый. :-) Как можно узнать, состояние поля, до обращения к БД?! Если бы Hibernate был бы квантовым движком, то используя состояние запутанности м/у таблицей и сущностью, то как так вы говорите можно было сделать. А так, пока никак. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2016, 06:48 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Эта постановка не из за того, что некоторые любят вместо удаления сущности ставить галку в бд 'как бы удалён'? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2016, 09:08 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Alexey TominИменно что. А мне надо до запроса. При этом надо как-то объяснить hibernate, что надо так вот извернутся. Самое простое - Создайте в базе вьюху и берите не удаленные (в т.ч. по дереву) записи из нее. Посложнее - тоже самое провернуть с query в Hibernate. (можно, например, join использовать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2016, 11:09 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
Petro123Эта постановка не из за того, что некоторые любят вместо удаления сущности ставить галку в бд 'как бы удалён'? Так бывает полезно. И удален - это только частный случай. В любом случае если тебе нужны только дети Ивана Ивановича Петрова, выкачивать из базы все 7 миллиардов населения Земли, чтоб потом установить кто из них кому родитель не лучшая идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2016, 11:12 |
|
||
|
Hibernate - взять значение "через голову" ManyToOne
|
|||
|---|---|---|---|
|
#18+
OFF Сергей АрсеньевТак бывает полезно. И удален - это только частный случай. Бывает конечно). Приходилось везде по разному решать. Когда копия строки с псевдо ID, когда в архив, когда в другую базу OLAP\LTP и т.д. и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2016, 11:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39337717&tid=2123548]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 414ms |

| 0 / 0 |
