2016-10-26 1 views
6

У меня есть связь между manyToManyUser и Role лиц (User> --- < Role)QueryDsl: Исключение «аргумент типа несоответствие» с проекцией фасолью и oneToMany или manyToMany ассоциации

Я хотел выполнить этот запрос:

createQuery() 
     .from(qUser) 
     .leftJoin(qUser.roles, qRole) 
     .where(qUser.login.eq(login)) 
     .singleResult(
       Projections.bean(User.class, 
         qUser.id, 
         qUser.login, 
         qUser.password, 
         GroupBy.set(Projections.bean(Role.class, 
           qRole.id, 
           qRole.code 
         )).as(qUser.roles) 
       ) 
     ); 

Сформированный запрос выглядит так, что для меня это идеальный:

SELECT user0_.ID AS col_0_0_, 
     user0_.LOGIN AS col_1_0_, 
     user0_.PASSWORD AS col_2_0_, 
     role2_.ID AS col_4_0_, 
     role2_.CODE AS col_5_0_ 
FROM public.USER user0_ 
LEFT OUTER JOIN public.USER_ROLE roles1_ ON user0_.ID=roles1_.USER_ID 
LEFT OUTER JOIN public.ROLE role2_ ON roles1_.ROLE_ID=role2_.ID 
WHERE user0_.LOGIN=? LIMIT ? 

Но у меня есть java.lang.IllegalArgumentException: argument type mismatch.

Я отлаживал и обнаружил, что данные из базы данных загружены без проблем. Это когда QueryDsl/Hibernate сделал некоторую интроспекцию, чтобы создать и инициализировать мои сущности, которые выбрасывают исключение.

Проблема заключается в том, что метод User.setRoles(Set<Role>) был вызван с параметром long: идентификатор первого списка Role субъекта User. Вместо создания SetRole затем сопоставьте эти роли с User.

Есть ли проблема с запросом? Или это не поддерживается QueryDsl?

Я использую QueryDsl 3.6.6 (я тестировал с 3.7.4: тот же результат)

+0

Как ясно говорится об ошибке, вы сравниваете несоответствующие типы. Вероятно, одно из этих условий: 'public.USER_ROLE role1_ ON user0_.ID = role1_.USER_ID' или' public.ROLE role2_ ON role1_.ROLE_ID = role2_.ID' – sagi

+0

Фактически, когда я запускаю запрос, данные загружаются отлично.Проблема возникла из сопоставления сущностей/данных –

+0

Исходя из php, но я не думаю, что вы можете параметризовать LIMIT – Mihai

ответ

0

Я предполагаю, что java.lang.IllegalArgumentException: argument type mismatch выбрасываются не по РЕГИСТРИРУЙТЕСЬ сравнения и вы можете убедиться в том, что с помощью идентификатора Проверка наличия тип 3 таблиц UTILISATEUR, ROLE и USER_ROLE.

  1. Если существует разница от типа между

UTILISATEUR.ID = USER_ROLE.USER_ID

или

USER_ROLE..ROLE_ID = ROLE.ID

так что это проблема.

  1. Если нет проблемы, исключение выдается критерием равенства входа.

Но, я подозреваю, что таблица соединения USER_ROLE не соединяется с правильной таблицей. У вас может быть две таблицы USER и UTILISATEUR. Если вы не переименовали таблицу соединений.

+0

Извините, нет таблицы UTILISATEUR, я хотел упростить пример ... Я исправил пример запроса. Проблема возникает не из запроса, а из привязки данных между данными запроса и моими объектами. –

+0

, поскольку LEFT JOIN выполняет объединение, начинающееся с первой таблицы, а затем любые соответствующие записи второй таблицы. И в соответствии с правилами ассоциации таблиц сгенерированный запрос является идеальным. Отсутствует индекс btree или хеш на логин (если он не был создан). – bilelovitch

+0

Я не вижу никакой связи между моей проблемой и логином –

Смежные вопросы