【问题标题】:Hibernate Query Language ProblemHibernate 查询语言问题
【发布时间】:2011-03-02 14:45:08
【问题描述】:

好吧,我已经在 hibernate 中实现了一个独特的查询。它返回我的结果。但是,在铸造时,这些领域正在互换。因此,它会产生铸造错误。应该怎么解决?

例如,我确实有数据库“ProjectAssignment”,它具有三个字段:aid、pid 和 userName。我想要该表中所有不同的用户名数据。我已申请查询:

select distinct userName, aid, pid from ProjectAssignment

而 ProjectAssignment.java 文件具有序列辅助、pid 和用户名中的字段。现在,这里的用户名是输出中的第一个字段。所以,铸造是不可能的。

另外,查询:

select aid, pid, distinct userName from ProjectAssignment

不工作。

什么是相同的正确查询?或者还有什么解决办法?

代码如下:

我必须检索数据的系统利用服务 Bean 方法:

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

ProjectAssignmentHelper 我从那里获取数据:

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

休眠数据 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;
    }
}

错误:

对于输入字符串:“用户名”

java.lang.NumberFormatException:对于输入字符串:“userName” 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 在 java.lang.Integer.parseInt(Integer.java:447) 在 java.lang.Integer.parseInt(Integer.java:497) 在 javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:375) 在 javax.el.ArrayELResolver.getValue(ArrayELResolver.java:195) 在 javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) 在 com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 在 com.sun.el.parser.AstValue.getValue(AstValue.java:116) 在 com.sun.el.parser.AstValue.getValue(AstValue.java:163) 在 com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) 在 com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) 在 javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) 在 javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) 在 javax.faces.component.UICommand.getValue(UICommand.java:218) 在 org.primefaces.component.commandlink.CommandLinkRenderer.encodeMarkup(CommandLinkRenderer.java:113) 在 org.primefaces.component.commandlink.CommandLinkRenderer.encodeEnd(CommandLinkRenderer.java:54) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 在 org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:70) 在 org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:54) 在 org.primefaces.component.datatable.DataTableRenderer.encodeTable(DataTableRenderer.java:525) 在 org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:407) 在 org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:193) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 在 org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:70) 在 org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:54) 在 org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:198) 在 org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:130) 在 org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:48) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) 在 javax.faces.render.Renderer.encodeChildren(Renderer.java:168) 在 javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 在 com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) 在 com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 在 com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 在 com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 在 org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:802) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:664) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:497) 在 org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:468) 在 org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:364) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:314) 在 org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:783) 在 org.apache.jsp.welcome_jsp._jspService(welcome_jsp.java 来自:59) 在 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:406) 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:483) 在 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:373) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 在 com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 在 com.sun.grizzly.ContextTask.run(ContextTask.java:69) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 在 java.lang.Thread.run(Thread.java:619)

【问题讨论】:

  • 添加hibernate的映射配置(hibernate.cfg.xml)

标签: java hibernate orm hql


【解决方案1】:

为什么要使用 HQL?

Hibernate 的理念是使用实体而不是表。理想情况下,您将加载实体并遍历它们以获得所需的字段。

我建议您对该查询使用 Hibernate Criteria 和 Criterion。

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

然后遍历列表获取你想要的字段。

【讨论】:

  • 根据我的经验,Criteria(和 DetachedCriteria)还没有您在编写自己的 HQL 语句时可以获得的全部功能。此外,您在此处的标准并未解决不同的约束。最后,HQL 仍然处理实体而不是表,因为在 HQL 中您查询的是实体及其属性,而不是表和列。
  • 非常感谢。我得到了标准的概念。但是,我仍然没有得到“GenericDAO”的概念。我的意思是说表达式接口和所有elxe。所以,我开始使用 HQL。
【解决方案2】:

首先,如果你使用如下投影:

select distinct aid, pid, userName from ProjectAssignment

您将获得Object[] 作为结果(或List&lt;Object[]&gt;),而不是List&lt;ProjectAssignment&gt;。如果您想在使用投影时获得强类型对象作为结果,您应该使用select NEW 表达式(假设您提供了正确的构造函数):

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

其次,我没有得到你真正想要的东西。根据简单的英文描述,查询将是:

select distinct userName from ProjectAssignment

但我不确定这是您所期望的。也许如果你用简单的英语澄清预期的结果是什么,我可以提供进一步的帮助。

第三,当前的问题与 Hibernate 和强制转换无关:

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

您只是想将不是数字的字符串格式化为数字。

【讨论】:

    【解决方案3】:
    Query query = session.createQuery("select distinct aid, pid, userName from ProjectAssignment");
    

    实际上,query.list() 将返回一个包含对象数组作为每个元素的 ArrayList 实例。并且数组上的每个元素都包含每一列的值。

    例如query.list().get(0) 将返回一个包含三个对象的数组

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

    所以,List&lt;Object[]&gt; 不能转换为 List&lt;ProjectAssignment&gt;

    一种可能的解决方案是实现ResultTransformer

    类似的东西............

    首先告诉 Hibernate 使用什么转换器

    query.setResultTransformer(new ProjectAssignmentTransformer());
    

    现在实施

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

    }

    在此之后,您将能够投射到 List&lt;ProjectAssignment&gt;

    希望这会有所帮助!

    -SE

    【讨论】:

    • 非常感谢您提供此解决方案。
    • 嗯。帕斯卡的回答更正确。转换错误与 Hibernate 无关。而且这个查询对我来说没有多大意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多