我有User
和Role
實體之間的關聯manyToMany
(User
> --- < Role
)QueryDsl:異常「參數類型不匹配」與投影豆和一對多或多對多關聯
我想執行該查詢:
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
。
我調試,我發現從數據庫id加載沒有問題的數據。這是QueryDsl/Hibernate做了一些反省來創建和初始化拋出異常的實體。
的問題是,該方法User.setRoles(Set<Role>)
已調用一個long
參數:所述User
的第一Role
實體列表的ID。然後將這些角色與User
關聯,而不是創建的Set
。
查詢有問題嗎?或者它不支持QueryDsl?
我現在用的是3.6.6 QueryDsl(我用3.7.4測試:同樣的結果)
由於錯誤信息清楚地表明 - 您正在比較不匹配的類型。可能是以下條件之一:'public.USER_ROLE roles1_ ON user0_.ID = roles1_.USER_ID'或'public.ROLE role2_ ON roles1_.ROLE_ID = role2_.ID' – sagi
實際上,當我運行查詢時,數據加載完美。問題來自實體/數據映射 –
來自php,但我不認爲你可以參數化極限 – Mihai