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