2 Replies Latest reply on Sep 17, 2006 1:46 PM by gavin.king

    setParameter: weird query behaviour

    mgombocz

      Hi folks,
      I am using Seam, JBoss AS, Facelets, MyFaces and would like to create application-scoped components (lists with salutations, titles etc.) for filling dropdown lists.
      I am doing that by having a SLSB with a @Factory method that initially fills my outjected variable "salutationItems".
      In the @Factory method I call "createQuery":

      Query query = em.createQuery("SELECT new javax.faces.model.SelectItem(s.value, s.label) FROM StringListItem s WHERE s.listType = 'SALUTATION' ORDER BY s.label");
      salutationItems = query.getResultList();
      

      In this case everything works fine!
      But, as soon as I want to use "setParameter" instead of the hardcoded Select statement...
      Query query = em.createQuery("SELECT new javax.faces.model.SelectItem(s.value, s.label) FROM StringListItem s WHERE s.listType = :lType ORDER BY s.label");
      query.setParameter("lType", "SALUTATION");
      salutationItems = query.getResultList();

      ...I get the error when I call the JSF page:
      javax.ejb.EJBTransactionRolledbackException: java.lang.ClassCastException: java.lang.String
       at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:93)
       at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
       at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:201)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:181)
       at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
       at $Proxy496.loadSalutations(Unknown Source)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at org.jboss.seam.util.Reflections.invoke(Reflections.java:13)
       at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:32)
       at org.jboss.seam.Component.callComponentMethod(Component.java:1334)
       at org.jboss.seam.Component.getInstanceFromFactory(Component.java:1293)
       at org.jboss.seam.Component.getInstance(Component.java:1260)
      ...

      I am trying on my own for hours now and give up...
      Could anyone of you please help me?

      Thanks!

      PS. Here's the complete code:
      @Stateless
      @Name("stringLists")
      public class StringListManager implements StringListManagerLocal {
      
       @Logger
       Log log;
      
       @PersistenceContext
       private EntityManager em;
      
       @Out(scope = ScopeType.APPLICATION)
       private List<SelectItem> salutationItems;
      
       @Factory("salutationItems")
       public void loadSalutations() {
       log.info("Start loading salutationItem");
      
       Query query = em
       .createQuery("SELECT new javax.faces.model.SelectItem(s.value, s.label) FROM StringListItem s WHERE s.listType = :lType ORDER BY s.label");
       query.setParameter("lType", "SALUTATION");
      
       salutationItems = query.getResultList();
      
       log.info("End loading salutationItem. Count: "+ salutationItems.size());
       }
      }

      Part of the JSF page:
      <h:selectOneMenu id="salut">
       <f:selectItems value="#{salutationItems}" />
       </h:selectOneMenu>