powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPQL & LEFT JOIN
8 сообщений из 8, страница 1 из 1
JPQL & LEFT JOIN
    #38994806
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Несколько дней не рашеается элементарная задача: получить ВСЕ "права" из одной таблицы и их значения из другой в зависимости от id группы.
Столкнулся со странностью: postgres не зотел обрабатывать LEFT JOIN очевидным для меня образом (мож оно и верно, но я не понимаю отчего так):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 
  properties_rights.right_name, 
  properties_group_right.right_value
FROM 
  public.properties_rights
LEFT JOIN
  public.properties_group_right
ON 
  properties_rights.right_id = properties_group_right.id_right
WHERE
  properties_group_right.id_group_right = '1'



//'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)"
),
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38994837
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
RuslanGab,
Потому что условие в where налагает ограничения на выборку, которая получилась после всех join'ов, а не на сам процесс соединения. Всё равно, что написать
Код: sql
1.
select * from (select ... from .. left join ... on ...) t where ....
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38994850
mld-11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
select propRight.rightName, propGroupRight.rightValue 
FROM PropertiesRights propRight 
LEFT JOIN PropertiesGroupRight propGroupRight 
ON propRight.rightId = propGroupRight.propertiesGroupRightPK.idRight 
AND propGroupRight.propertiesGroupRightPK.idGroupRight = 
(select :idGroup /*from dual */ --Oracle)
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38994853
mld-11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
либо:

Код: plsql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38994892
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 нет
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38994970
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СДЕЛАЛ!
почему раньше не шло не осознаю до сих пор... Просто написал снова. Единственное: понараждалось 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.
            resultList = getEntityManager().createNamedQuery("PropertiesGroupRight.findRightsGroup")
            .setParameter("idGroup", groupId)
            .getResultList();  

            for (Object[] record : resultList) {
                if (record[2]==null) { record[2] = "false"; }
            }
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38995004
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RuslanGab,
не знаю, что там за меппинг, но запрос выглядит не как jpql, а как обычный sql. При этом внешняя таблица проверяется в where, что дает результаты аналогичные inner join, но со скоростью jeft join. Правильно (на sql) должно быть так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
  properties_rights.right_name, 
  properties_group_right.right_value
FROM 
  public.properties_rights
LEFT JOIN
  public.properties_group_right 
ON properties_rights.right_id = properties_group_right.id_right AND properties_group_right.id_group_right = :idgroup


в jpql (при павильном меппинге):
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
  propertiesRights.rightName, 
  propertiesGroupRight.rightValue
FROM 
  PropertiesRights propertiesRights
LEFT JOIN PropertiesGroupRight propertiesGroupRight ON propertiesGroupRight.idGroupRight = :idgroup
...
Рейтинг: 0 / 0
JPQL & LEFT JOIN
    #38995191
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
SELECT 
  properties_rights.right_name, 
  properties_group_right.right_value
FROM 
  public.properties_rights
LEFT JOIN
  public.properties_group_right
ON 
  properties_rights.right_id = properties_group_right.id_right
AND
  properties_group_right.id_group_right = '1'



Но нормально оформить его в JPQL увы так и не смог по описанным выше причинам: в AND или ON не мог запихнуть напрямую параметр и когда это таки вышло через костыль пришлось еще ловить нули
:(
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPQL & LEFT JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]