2016-10-26 22 views
6

我有UserRole實體之間的關聯manyToManyUser> --- < RoleQueryDsl:異常「參數類型不匹配」與投影豆和一對多或多對多關聯

我想執行該查詢:

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測試:同樣的結果)

+0

由於錯誤信息清楚地表明 - 您正在比較不匹配的類型。可能是以下條件之一:'public.USER_ROLE roles1_ ON user0_.ID = roles1_.USER_ID'或'public.ROLE role2_ ON roles1_.ROLE_ID = role2_.ID' – sagi

+0

實際上,當我運行查詢時,數據加載完美。問題來自實體/數據映射 –

+0

來自php,但我不認爲你可以參數化極限 – Mihai

回答

0

我猜測,java.lang.IllegalArgumentException: argument type mismatch甩不JOIN比較,你可以驗證通過verifing的ID 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

我沒有看到我的問題和登錄之間的任何關係 –