2010-06-11 12 views
1

Eh bien, j'ai implémenté une requête distincte dans Hibernate. Cela me renvoie le résultat. Mais, tout en coulant les champs sont échangés. Donc, il génère une erreur de casting. Quelle devrait être la solution? Par exemple, j'ai une base de données, "ProjectAssignment" qui a trois champs, aide, & userName. Je veux toutes les données distinctes userName de cette table. J'ai appliqué la requête:Hibernate Query Language Problème

select distinct userName, aid, pid from ProjectAssignment 

Alors que le fichier a ProjectAssignment.java les champs de l'aide de la séquence, pid & userName. Maintenant, ici, le nom d'utilisateur est le premier champ en sortie. Donc, Casting n'est pas possible.

En outre, la requête:

select aid, pid, distinct userName from ProjectAssignment 

ne fonctionne pas.

Quelle est la bonne requête pour le même? Ou quoi d'autre la solution?

Le code est comme ci-dessous:

service d'utilisation du système Bean Méthode où je dois récupérer des données:

public List<ProjectAssignment> getProjectAssignments() { 
     projectAssignments = ProjectAssignmentHelper.getAllResources(); //Here comes the error 
     return projectAssignments; 
    } 

ProjectAssignmentHelper d'où je récupérer les données:

package com.hibernate; 

import java.util.List; 
import org.hibernate.Query; 
import org.hibernate.Session; 

public class ProjectAssignmentHelper { 

    public static List<ProjectAssignment> getAllResources() { 
     List<ProjectAssignment> projectMasters; 

     Session session = HibernateUtil.getSessionFactory().openSession(); 
     Query query = session.createQuery("select distinct aid, pid, userName from ProjectAssignment"); 
     projectMasters = (List<ProjectAssignment>) query.list(); 
     session.close(); 

     return projectMasters; 
    } 
} 

Hibernate données Bean :

package com.hibernate; 

public class ProjectAssignment implements java.io.Serializable { 

    private short aid; 
    private String pid; 
    private String userName; 

    public ProjectAssignment() { 
    } 


    public ProjectAssignment(short aid) { 
     this.aid = aid; 
    } 
    public ProjectAssignment(short aid, String pid, String userName) { 
     this.aid = aid; 
     this.pid = pid; 
     this.userName = userName; 
    } 

    public short getAid() { 
     return this.aid; 
    } 

    public void setAid(short aid) { 
     this.aid = aid; 
    } 
    public String getPid() { 
     return this.pid; 
    } 

    public void setPid(String pid) { 
     this.pid = pid; 
    } 
    public String getUserName() { 
     return this.userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 
} 

Erreur:

Pour chaîne d'entrée: "userName"

 
java.lang.NumberFormatException: For input string: "userName" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Integer.parseInt(Integer.java:447) 
at java.lang.Integer.parseInt(Integer.java:497) 
at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:375) 
at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:195) 
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) 
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 
at com.sun.el.parser.AstValue.getValue(AstValue.java:116) 
at com.sun.el.parser.AstValue.getValue(AstValue.java:163) 
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) 
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) 
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) 
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) 
at javax.faces.component.UICommand.getValue(UICommand.java:218) 
at org.primefaces.component.commandlink.CommandLinkRenderer.encodeMarkup(CommandLinkRenderer.java:113) 
at org.primefaces.component.commandlink.CommandLinkRenderer.encodeEnd(CommandLinkRenderer.java:54) 
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:70) 
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:54) 
at org.primefaces.component.datatable.DataTableRenderer.encodeTable(DataTableRenderer.java:525) 
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:407) 
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:193) 
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:70) 
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:54) 
at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:198) 
at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:130) 
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:48) 
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) 
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) 
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) 
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:802) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:664) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:497) 
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:468) 
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:364) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:314) 
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:783) 
at org.apache.jsp.welcome_jsp._jspService(welcome_jsp.java from :59) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:406) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:483) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:373) 
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) 
+0

Ajouter la configuration de mappage de mise en veille prolongée (hibernate.cfg.xml) – pakore

Répondre

0

Pourquoi voulez-vous utiliser HQL?

L'idée d'Hibernate est de travailler avec des entités et non avec des tables. Idéalement, vous devez charger les entités et les parcourir pour obtenir les champs souhaités.

Je vous suggère d'utiliser les critères Hibernate et le critère de cette requête.

Criteria crit = session.createCriteria(ProjectAssignment.class); 
List projectAssignments = crit.list(); 

Ensuite parcourez la liste pour obtenir les champs souhaités.

+1

Dans mon expérience, les critères (et DetachedCriteria) ne sont pas encore toutes les fonctionnalités que vous pouvez obtenir par écrit vos propres déclarations HQL. De plus, vos critères ici ne traitent pas de la contrainte distincte. Enfin, HQL traite toujours les entités et non les tables puisque dans HQL vous interrogez les entités et leurs propriétés, et non les tables et les colonnes. – digitaljoel

+0

Merci beaucoup. J'ai eu le concept de Critères. Mais, je n'ai toujours pas eu le concept de "GenericDAO". Je veux dire l'Expression Interface & tout elxe. Donc, j'ai commencé à utiliser HQL. –

2

Tout d'abord, si vous utilisez des projections comme dans:

select distinct aid, pid, userName from ProjectAssignment 

Vous obtiendrez un résultat Object[] comme (ou un List<Object[]>), pas un List<ProjectAssignment>. Si vous souhaitez obtenir de solides objets typés comme résultat lors de l'utilisation des projections, vous devez utiliser l'expression select NEW (en supposant que vous fournissez le constructeur approprié):

select new com.hibernate.ProjectAssignment(...) from ProjectAssignment. 

Deuxièmement, je ne comprends pas ce que vous voulez vraiment.De la description en anglais, la requête serait:

select distinct userName from ProjectAssignment 

Mais je ne suis pas sûr que c'est ce que vous attendez. Peut-être que si vous clarifiez en anglais clair quel est le résultat attendu, je pourrais aider plus loin.

En troisième lieu, le problème actuel n'a rien à voir avec Hibernate ni coulée:

java.lang.NumberFormatException: For input string: "userName" 

Vous essayez juste de formater une chaîne qui n'est pas un numéro comme numéro.

2
Query query = session.createQuery("select distinct aid, pid, userName from ProjectAssignment"); 

En fait, query.list() renverra une instance de ArrayList contenant un tableau d'objets en tant que chaque élément. Et chaque élément sur tableau contient une valeur pour chaque colonne.

par exemple. Query.list(). get (0) retourne un tableau de trois objets

array[0] = value of aid 
array[1] = value of pid 
array[2] = value of userName 

donc, List<Object[]> ne peut pas être jeté à List<ProjectAssignment>

Une solution possible est de mettre en œuvre ResultTransformer

quelque chose comme ça .........

d'abord dire Hibernate ce transformateur à utiliser

query.setResultTransformer(new ProjectAssignmentTransformer()); 

Maintenant, la mise en œuvre

class ProjectAssignmentTransformer implements ResultTransformer { 

@Override 
public Object transformTuple(Object[] tuples, String[] aliases) { 
      Object aid = tuples[0]; 
      Object pid = tuples[1]; 
      Object userName = tuples[2]; 
      /* construct ProjectAssignment instance using appropriate args*/ 
    return new ProjectAssignment (aid, pid, (String) userName); 
} 

@Override 
public List transformList(List collection) { 
    List<ProjectAssignment> assignments = new ArrayList<ProjectAssignment>(); 
    for(Object o : collection) 
    { 
     assignments.add((ProjectAssignment)o); 
    } 
    return assignments; 
} 

}

Après cela, vous serez en mesure de jeter à List<ProjectAssignment>.

Espérons que cela aide!

-SE

+0

Merci beaucoup pour cette solution. –

+0

Je veux juste résoudre l'erreur de moulage que j'ai eu. –

+0

Meh. La réponse de Pascal était plus correcte. L'erreur de casting n'a rien à voir avec Hibernate. Et la question n'a pas beaucoup de sens pour moi. –