Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203

    ejbql impostare 2 variabili

    Ciao a tutti ragazzi innanzi tutto vi voglio ringraziare per l'enorme aiuto che mi state dando in quest'ultimo periodo e per l'enorme pazienza che avete nel rispondere alle mie domande anche se sono molto elementari.
    Il mio nuovo problema è che dovrei implementare una funzione di ricerca che segua questa query:

    codice:
     SELECT * FROM nomrDB WHERE campo1='val1' AND campo2='val2?;
    e non so nei session come poterlo impostare.
    Ho impostato altre ricerche con una variabile in questo modo:

    codice:
     
    public List<VRicercaAggrCodDispaccio> findDispByFrazionario(String frazionario) {
    	Query q = em.createQuery("SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.frazionario = :frazionario");
    		q.setParameter("frazionario", frazionario);
    			return q.getResultList();
    }
    Posso impostare tutto in un metodo oppure devo creare due metodi distinti che effettua le due ricerche e fare qualche controllo nella servlet?

    Lo so la domanda potrebbe risultare banale ma non so come fare per inserire l'ultima parte della query che vi ho scritto prima.
    Grazie infinitamente ragazzi
    Siete fantastici

  2. #2
    Scusa ma non ho capito bene qual'è il problema. :master:
    Al mio segnale... scatenate l'inferno!

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203
    R@ve

    non riesco ad inserire nella query la variabile dopo l ' AND (cioè campo2='val2'
    c'è un modo per fare una query di questo tipo in un solo metodo oppure mi devo creare due metodi distinti?
    cioè ho un form che ha due campi d'inserimento e devo avere dei risultati "scremati" per entrambi le chiavi.
    Non so se sono riuscito a farmi capire bene

  4. #4
    Ma intendi valori parametrici come impostato nell'esempio che hai fatto?

    Codice PHP:
    SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.frazionario = :frazionario AND d.altroCampo = :altroValore 
    Una cosa del genere?

    In questo caso resta tutto uguale all'esempio da te postato ma devi settare anche l'altro parametro.
    Al mio segnale... scatenate l'inferno!

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203
    si hai capito benissimo.
    La cosa che non mi è chiara è come mettere questa parte di codice con entrambi i valori:

    codice:
     
    q.setParameter("frazionario", frazionario);
    			return q.getResultList();
    dovrei creare un q1 ed un q2?
    poi nel return cosa metto?

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203
    io per il momento ho fatto così:
    nella jsp mi sono creato un form
    codice:
     
    <form action="FindByFrazStatDisp_srv" class="container">
                  
    
    
                  Frazionario:    <input type="text" name="frazionario">
                  </p>
                  
    
    
                  Status: 
                  <select name="status">
                        <option> Seleziona lo status </option>
                        <option> E - Electronical Image </option>
                        <option> K - In controllo </option>
                        <option> T - Controllato </option>
                        <option> O - Aperto </option>
                        <option> S - Sospeso</option>
                        <option> C - Chiuso</option>
                        <option> X - Expired</option>
                        <option> L - Aggregato</option>
                    </select>
                  </p>
                 
                <input type="submit" value="Ricerca">
              </form>
    che mi restituisce 2 stringhe.
    Nella servlet ho fatto così, devo trasformare la stringa che mi viene dallo status in char:

    codice:
    String stringFrazDisp = request.getParameter("frazionario");
                    System.out.println("Frazionario: " + stringFrazDisp);
                String stringStatDisp = request.getParameter("status");
                    System.out.println("Status: " + stringStatDisp);
                char status = stringStatDisp.charAt(0);
                    System.out.println("Carattere prelevato dalla String: " + status);
                    List frazDisp = controllerDao.findByFrazionarioDispaccio(stringFrazDisp);
                    List statDisp = controllerDao.findByStatusDispaccio(status);
                    Iterator i = frazDisp.iterator();
                        request.setAttribute("frazionario", i);
                    Iterator ic = statDisp.iterator();
                        request.setAttribute("status", ic);
                    if(frazDisp.equals(stringFrazDisp) && statDisp.equals(status)) {
                        request.setAttribute("frazStat", i);        //qua credo che ci sia un bel casino :D
                        request.getRequestDispatcher("/fraz_disp.jsp").forward(request, response);
                    } else {
                        request.getRequestDispatcher("/error.jsp").forward(request, response);
                    }
    ah i System.out mi sono serviti solamente per verificare che dati mi arrivavano
    la chiamata la faccio passare tramite un controller e nei session ho fatto così:

    codice:
     
    public List<VRicercaAggrCodDispaccio> findDispByFrazionario(String frazionario) {
        Query q = em.createQuery("SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.frazionario = :frazionario");
            q.setParameter("frazionario", frazionario);
                return q.getResultList();
    }
    public List<VRicercaAggrCodDispaccio> findDispByStatus(char status) {
        Query q = em.createQuery("SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.status = :status");
            q.setParameter("status", status);
                return q.getResultList();
    }
    Ma mi restituisce sempre la pagina d'errore
    dove sbaglio?
    c'è un modo più corretto di formulare il tutto?

  7. #7
    Allora, le ipotesi sono diverse in base al fatto se oltre alla query a due parametri ti servono anche le singole query con un solo parametro. Per generalizzare potresti esporre 3 metodi:

    Codice PHP:
    public List<VRicercaAggrCodDispacciofind(String frazionarioString status) {
         
    String queryString "SELECT d FROM VRicercaAggrCodDispaccio d ";
         
    String whereClause "";
         if(
    frazionario != null && !frazionario.equals("")){ 
              
    whereClause += " WHERE d.frazionario = :frazionario ";
         }
         if(
    status != null && !status.equals("")){
              if(
    whereClause .length() != 0){
                   
    whereClause += " AND d.status = :status ";
              }else{
                   
    whereClause +=" WHERE d.status = :status";
              }
         }

         
    Query q em.createQuery(queryString whereClause );
         if(
    frazionario != null && !frazionario.equals("")){
              
    q.setParameter("frazionario"frazionario);
         }
         if(
    status!= null && !status.equals("")){
              
    q.setParameter("status"status);
         }
         return 
    q.getResultList();
    }

    public List<
    VRicercaAggrCodDispacciofindDispByFrazionario(String frazionario) {
         return 
    find(frazionarionull);
    }
    public List<
    VRicercaAggrCodDispacciofindDispByStatus(String status) {
         return 
    find(nullstatus);

    Certamente il metodo potrebbe essere migliorato e generalizzato anche per più parametri. Se sei sicuro di avere sempre due parametri entrambi valorizzati, allora ti basta semplicemente:

    Codice PHP:
    public List<VRicercaAggrCodDispacciofindDispByFrazionarioAndStatus(String frazionarioString status) {
         
    Query q em.createQuery("SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.frazionario = :frazionario AND d.status = :status");
         
    q.setParameter("frazionario"frazionario);
         
    q.setParameter("status"status);
         return 
    q.getResultList();

    Al mio segnale... scatenate l'inferno!

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203
    innanzi tutto grazie mille r@ve sei veramente un grande e disponibilissimo come tutti gli altri di questo forum.
    ho impostato il session come mi hai suggerito te (entrambi i campi devono essere obbligatoriamente compilati per effettuare la ricerca) perciò ho preso il secondo metodo che mi hai scritto (ho fatto solamente una piccola modifica perchè lo status è un char, infatti nella servlet ho dovuto prelevarmi solamente il char che mi occorreva).

    Perciò adesso questo è il mio session:

    codice:
     
    public List<VRicercaAggrCodDispaccio> findDispByFrazionarioAndStatus(String frazionario, char status) {
         Query q = em.createQuery("SELECT d FROM VRicercaAggrCodDispaccio d WHERE d.frazionario = :frazionario AND d.status = :status");
         q.setParameter("frazionario", frazionario);
         q.setParameter("status", status);
         return q.getResultList();
    }
    Non ho capito bene il fatto della variabile q, ma fa un ovverride del primo valore cioè frazionario o può memorizzare entrambi i valori???

    apparte questa cosa.
    questa è la mia servlet:

    codice:
     
    String stringFrazDisp = request.getParameter("frazionario");
                    System.out.println("Frazionario: " + stringFrazDisp);
                String stringStatDisp = request.getParameter("status");
                    System.out.println("Status: " + stringStatDisp);
                char status = stringStatDisp.charAt(0);
                    System.out.println("Carattere prelevato dalla String: " + status);
                    List frazStatDisp = controllerDao.findByFrazionarioAndStatusDisp(stringStatDisp, status);
                        Iterator i = frazStatDisp.iterator();
                        request.setAttribute("frazStatdisp", i);
                            if (frazStatDisp  != null) {
                    request.getRequestDispatcher("/frazStat_disp.jsp").forward(request, response);
                } else {
                    request.getRequestDispatcher("/error.jsp").forward(request, response);
                }
    i System mi servivano solamente per vedere se i valori erano corretti

    e questo è il metodo del mio controller:

    codice:
     
    richiamo l'ejb
    
     @EJB
        private VRicercaAggrCodiceFacadeLocal vRicercaAggrCodiceFacade;
    
    ed utilizzo questo metodo:
    
    public List findByFrazionarioAndStatusDisp(String frazionario, char status) {
            return  vRicercaAggrCodDispaccioFacade.findDispByFrazionarioAndStatus(frazionario, status);
        }
    ma al momento in cui chiamo il metodo mi da questo errore:

    codice:
     
    AVVERTENZA: A system exception occurred during an invocation on EJB ControllerDao method public java.util.List controller.ControllerDao.findByFrazionarioAndStatusDisp(java.lang.String,char)
    javax.ejb.AccessLocalException: Client not authorized for this invocation.
            at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1801)
            at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188)
            at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
            at $Proxy127.findByFrazionarioAndStatusDisp(Unknown Source)
            at servlet_findBy.FindByFrazStatDisp_srv.processRequest(FindByFrazStatDisp_srv.java:33)
            at servlet_findBy.FindByFrazStatDisp_srv.doGet(FindByFrazStatDisp_srv.java:73)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
            at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
            at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
            at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
            at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
            at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
            at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
            at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
            at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
            at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
            at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
            at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
            at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
            at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
            at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
            at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
            at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
            at java.lang.Thread.run(Thread.java:619)
    
    AVVERTENZA: StandardWrapperValve[FindByFrazStatDisp_srv]: PWC1406: Servlet.service() for servlet FindByFrazStatDisp_srv threw exception
    javax.ejb.EJBAccessException
            at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2213)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1906)
            at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
            at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
            at $Proxy127.findByFrazionarioAndStatusDisp(Unknown Source)
            at servlet_findBy.FindByFrazStatDisp_srv.processRequest(FindByFrazStatDisp_srv.java:33)
            at servlet_findBy.FindByFrazStatDisp_srv.doGet(FindByFrazStatDisp_srv.java:73)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
            at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
            at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
            at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
            at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
            at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
            at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
            at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
            at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
            at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
            at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
            at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
            at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
            at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
            at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
            at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
            at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
            at java.lang.Thread.run(Thread.java:619)
    Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.
            at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1801)
            at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188)
            ... 30 more
    cosa sbaglio?

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    203
    correggo mi reindirizza correttamente alla pagina ma non mi stampa nessun tipo di risultato perchèèèè ????

  10. #10
    Nell'oggetto Query puoi settare un numero qualsiasi di parametro. Ogni parametro è identificato nella stringa che rappresenta la tua query da un nome (come nel tuo caso) o da un indice (non è il tuo caso).

    Codice PHP:
    String queryString "select campo FROM tabella t WHERE t.campo1 = :parametroCampo1 AND t.campo2 = :parametroCampo2 AND ... t.campoN = :parametroCampoN";
    ...

    Query query = ....
    query.setParameter("parametroCampo1"valore1);
    query.setParameter("parametroCampo2"valore2);
    ...
    query.setParameter("parametroCampoN"valoreN); 
    Per il secondo problema, hai risolto l'eccezione e non ti esce nulla a video?
    Al mio segnale... scatenate l'inferno!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.