JPQL和实体(java.lang.IllegalArgumentException)

时间:2017-04-23 14:17:09

标签: glassfish ejb jpql

我正在创建一个Web应用程序,需要一个通知表才能显示给不同的用户。由于某种原因,我写的JPQL查询抛出了java.lang.IllegalArgumentException。我的应用程序已经有一个事务表,使用相同的方法(afaik)进行结构化和查询,这非常有效。

我一直在改变代码,改变变量名称和字符大小写几个小时试图让它工作但我每次都得到例外。有谁知道我哪里出错了?

My 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
    }

从EJB(NotificationStorageServiceBean)调用JPQL查询,该EJB使用以下方法实现接口(NotificationStorageService):

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

从我的.xhtml UI的CDI支持bean调用EJB方法,使用FacesContext当前登录的用户提供这些方法的参数。

    @EJB
    NotificationStorageService notificationStore;

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

我得到的确切错误是: java.lang.IllegalArgumentException:您尝试使用查询字符串中不存在的notificationrecipient名称设置参数值SELECT n FROM NotificationEntity n WHERE n.notificationrecipient =:username。

1 个答案:

答案 0 :(得分:0)

JPQL查询中的参数名称以冒号开头。所以只需使用

setParameter("username", username)