У меня есть связь между manyToMany
User
и 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
. Вместо создания Set
Role
затем сопоставьте эти роли с User
.
Есть ли проблема с запросом? Или это не поддерживается QueryDsl?
Я использую QueryDsl 3.6.6 (я тестировал с 3.7.4: тот же результат)
Как ясно говорится об ошибке, вы сравниваете несоответствующие типы. Вероятно, одно из этих условий: 'public.USER_ROLE role1_ ON user0_.ID = role1_.USER_ID' или' public.ROLE role2_ ON role1_.ROLE_ID = role2_.ID' – sagi
Фактически, когда я запускаю запрос, данные загружаются отлично.Проблема возникла из сопоставления сущностей/данных –
Исходя из php, но я не думаю, что вы можете параметризовать LIMIT – Mihai