2017-04-23 63 views
0

我正在創建一個Web應用程序,需要一個通知表來顯示給不同的用戶。出於某種原因,我寫的JPQL查詢是拋出java.lang.IllegalArgumentException。我的應用程序已經有一個事務處理表,使用完全相同的方法(afaik)進行結構化和查詢。JPQL和實體(java.lang.IllegalArgumentException)

我一直在洗牌代碼,改變變量名稱和字符大小寫數小時試圖讓這個工作,但我仍然得到每一次例外。有沒有人知道我要去哪裏錯了?

我NotificationEntity如下:

@Table(name="notificationentity") 
    @NamedQuery(name="fetch_user_notifications", query="SELECT n FROM NotificationEntity n WHERE n.notificationrecipient=:username") 
    @Entity 
    public class NotificationEntity implements Serializable 
    { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 

     @NotNull 
     String notificationSender; 

     @NotNull 
     String notificationrecipient; 

     ... other fields + methods 
    } 

的JPQL查詢從實現以下方法的接口(NotificationStorageService)的EJB(NotificationStorageServiceBean)稱爲:

@Override 
    public synchronized List<NotificationEntity> getUserNotificationList(String username) 
    { 
     List notifications; 
     notifications = em.createNamedQuery("fetch_user_notifications").setParameter("notificationrecipient", username).getResultList(); 
     return notifications; 
    } 

和EJB方法從我的.xhtml UI的CDI輔助bean中調用,使用FacesContext當前登錄的用戶爲這些方法提供參數。

@EJB 
    NotificationStorageService notificationStore; 

    public List<NotificationEntity> getUserNotificationList() 
    { 
     return notificationStore.getUserNotificationList(this.currentUser); 
    } 

確切的錯誤我得到的是: java.lang.IllegalArgumentException異常:您曾試圖設定使用不查詢字符串存在notificationrecipient的名稱參數值選擇N FROM NotificationEntity n,其中n。 notificationrecipient =:用戶名。

回答

0

JPQL查詢中的參數名稱以冒號開頭。所以只需使用

setParameter("username", username) 
+0

非常感謝!這一直讓我瘋狂。我明顯誤解了setParameter方法。我以爲我的意思是引用實體字段,而不是我在我的命名查詢中設置的參數。這工作在我的交易表中,因爲實體字段,表列標題和參數都共享相同的名稱 – TNARGI

相關問題