|
|
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
Несколько дней не рашеается элементарная задача: получить ВСЕ "права" из одной таблицы и их значения из другой в зависимости от id группы. Столкнулся со странностью: postgres не зотел обрабатывать LEFT JOIN очевидным для меня образом (мож оно и верно, но я не понимаю отчего так): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. //'1'=:igGroup Получаю "right3";f "right4";f "right5";f "right6";f А должно быть "right3";f "right4";f "right5";f "right6";f "right2"; "right1"; Второй вариант таки заработал после банальной замены WHERE на AND в Postgres. А теперь совсем пляски: JPQL не дает ставить параметры в ON, AND -> получил тогда этот параметр ('1') в подзапросе. JPQL ругаться перестал, а выводит все одно "right3";f "right4";f "right5";f "right6";f Использование NativeQuery не возможно, ибо принципиально необходим "потенциал" работы с разными базами данных. Кто может что подсказать? Кстати есть другие таблицы где LEFT JOIN работает "нормально". именно тут такая пляска отчего ума не приложу все вроде сто раз проверил... Вот он мой костыль, который ничем мяе помочь не может:( @NamedQuery(name = "PropertiesRights.findRightsGroup", query = "SELECT " + "propRight.rightName, propGroupRight.rightValue " + "FROM PropertiesRights propRight " + "LEFT JOIN PropertiesGroupRight propGroupRight " + "ON propRight.rightId = propGroupRight.propertiesGroupRightPK.idRight " + "AND propGroupRight.propertiesGroupRightPK.idGroupRight = " + "(SELECT propGroupRight.propertiesGroupRightPK.idGroupRight " + "FROM PropertiesGroupRight propGroupRight where propGroupRight.propertiesGroupRightPK.idGroupRight = :idGroup " + "GROUP BY propGroupRight.propertiesGroupRightPK.idGroupRight)" ), ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 12:04 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
RuslanGab, Потому что условие в where налагает ограничения на выборку, которая получилась после всех join'ов, а не на сам процесс соединения. Всё равно, что написать Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 12:37 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 12:46 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
либо: Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 12:48 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
vsl, Да согласен. AND налагает на сам процесс, хотя по идее это должно быть c LEFT JOIN по боку. Ну ок. JPQL ведь все равно с AND тоже не пашет... mld-11, query = "SELECT " + "propRight.rightName, propGroupRight.rightValue " + "FROM PropertiesRights propRight " + "LEFT JOIN PropertiesGroupRight propGroupRight " + "ON propRight.rightId = propGroupRight.propertiesGroupRightPK.idRight " + "WHERE propGroupRight.propertiesGroupRightPK.idGroupRight = :idGroup " + " OR propGroupRight.propertiesGroupRightPK.idRight IS NULL "), Идея хороша спасибо. Вывод только один хрен... "right3";f "right4";f "right5";f "right6";f про /*from dual */ честно говоря не понял, но подозреваю это возможность пихнуть параметр в AND. Думаю не выйдет (я о результате а не пихнуть), ибо костылем параметр-то я засунул, и остался гадать на этом отчего один и тот же по сути код в postgres выдает все а в JPQL нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 13:10 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
СДЕЛАЛ! почему раньше не шло не осознаю до сих пор... Просто написал снова. Единственное: понараждалось NullPointerException (COALESCE гад работать c boolean отказывается - косяки на косяках), так что пришлось еще "единичку выбирать" и потом при записи результатов на нули проверить, что наверное далеко от оптимальности, но радость что хоть как-то работает. Всем большое спасибо! Если кому интересно вот код: @NamedQuery(name = "PropertiesGroupRight.findRightsGroup", query = "SELECT 1, " + "COALESCE (propRight.rightName, ''), " + "propGroupRight.rightValue " + "FROM PropertiesRights propRight " + "LEFT JOIN PropertiesGroupRight propGroupRight " + "ON propRight.rightId = propGroupRight.propertiesGroupRightPK.idRight " + "AND propGroupRight.propertiesGroupRightPK.idGroupRight = " + "(SELECT propGroupRight.propertiesGroupRightPK.idGroupRight " + "FROM PropertiesGroupRight propGroupRight where propGroupRight.propertiesGroupRightPK.idGroupRight = :idGroup " + "GROUP BY propGroupRight.propertiesGroupRightPK.idGroupRight) " + "ORDER BY propRight.rightName") JAVA: Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 13:47 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
RuslanGab, не знаю, что там за меппинг, но запрос выглядит не как jpql, а как обычный sql. При этом внешняя таблица проверяется в where, что дает результаты аналогичные inner join, но со скоростью jeft join. Правильно (на sql) должно быть так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. в jpql (при павильном меппинге): Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 14:14 |
|
||
|
JPQL & LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
ivanra, Я безусловно далек от профессионала и допускаю что мэппинг у меня не совсем верный (выкладывать уж все не буду - не думаю что кто-то будет так уж вникать если даже мой шеф этого не делает). Тем не менее ваш красивый запрос конкретно у меня выдает вот такое: "right1";f "right1";f "right1";f "right1";f "right2";f "right2";f "right2";f "right2";f "right3";f "right3";f "right3";f "right3";f "right4";f "right4";f "right4";f "right4";f "right5";f "right5";f "right5";f "right5";f "right6";f "right6";f "right6";f "right6";f В postgres я написал работающий запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но нормально оформить его в JPQL увы так и не смог по описанным выше причинам: в AND или ON не мог запихнуть напрямую параметр и когда это таки вышло через костыль пришлось еще ловить нули :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 16:41 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=126&tid=2125238]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 326ms |

| 0 / 0 |
