gpt4 book ai didi

java - Hibernate 查询语言问题

转载 作者:行者123 更新时间:2023-11-29 08:17:52 24 4
gpt4 key购买 nike

好吧,我已经在 hibernate 中实现了一个独特的查询。它返回我的结果。但是,在类型转换领域正在互换。因此,它会产生类型转换错误。应该如何解决?

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

select distinct userName, aid, pid from ProjectAssignment

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

另外,查询:

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

hibernate 数据 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: 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)

最佳答案

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<Object[]>无法转换为 List<ProjectAssignment>

一个可能的解决方案是实现 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<ProjectAssignment> .

希望这对您有所帮助!

-东南

关于java - Hibernate 查询语言问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com