2012-07-11 77 views
2

我正在使用Jesey在java中实现Restful Web服务(JAX-RS)。我在Tomcat v7.0上运行它,我使用Hibernate将数据映射到数据库(MySQL)。我有一个查询来获取交付清单:使用MySQL的SQL查询

deliverables = (List<Deliverable>) session.createQuery("Select deliverable from 
       Task as t where t.project.id= :id And t.user.username = :name") 
    .setLong("id", projectId).setString("name", username).list(); 

这是给我交付了一百,但我想在工作表前三名。我很感激任何帮助。我如何修改查询?

请注意,这三个可交付成果不应重复。

与@FGreg答案有冲突。当我使用这些查询,一切工作正常:

deliverables = (List<Deliverable>) session.createQuery(
    "from Deliverable as d where d.project.id= :id").setLong("id", projectId).list(); 
    long task_id; 
    for(Deliverable d: deliverables) { 
     task_id = (long) session.createQuery("Select Max(id) from Task as t where  
     t.deliverable.id = :id and t.user.username = :name") 
     .setLong("id", d.getId()).setString("name", username).uniqueResult(); 
     d.setTask_id(task_id); 
    } 
    sortDeliverable(deliverables); // sort by Task_id 

我想通过@FGreg提供的查询中,MAX(ID)不被视为例如交付与TASK_ID = 31,643使用两次。它可能会考虑Task_id = 31,这是错误的。任何帮助解决它?

我试着@FGreg查询没有不同。然后除了重复问题,它工作正常。

我尝试这样做:

deliverables = (List<Deliverable>) session.createQuery("from Deliverable as d inner join 
Task as t where t.id = (select max(t1.id) from Task as t1 where t1.deliverable.id = d.id) 
and d.project.id= :id and t.user.username = :name order by t.id desc") 
        .setMaxResults(3) 
        .setLong("id", projectId) 
        .setString("name", username) 
        .list(); 

而且我得到的堆栈跟踪新的错误:

Jul 13, 2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError 
ERROR: Path expected for join! 
Jul 13, 2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError 
ERROR: Path expected for join! 
Path expected for join! 
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:371) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3477) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3263) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3141) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:694) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:550) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:287) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350) 
    at $Proxy65.createQuery(Unknown Source) 
    at se.softwerk.timelog.controller.DeliverableManager.deliverableList2(DeliverableManager.java:185) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Jul 13, 2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError 
ERROR: Invalid path: 't.id' 
Jul 13, 2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError 
ERROR: Invalid path: 't.id' 
Invalid path: 't.id' 
    at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:131) 
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:219) 
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:118) 
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114) 
    at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:883) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1246) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4252) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3730) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1923) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1848) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1848) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:782) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:583) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:287) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350) 
    at $Proxy65.createQuery(Unknown Source) 
    at se.softwerk.timelog.controller.DeliverableManager.deliverableList2(DeliverableManager.java:185) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 

模型类:

@Entity 
public class Task { 

    @Id 
    @GeneratedValue 
    private long id; 

    @ManyToOne(optional = false) 
    private User user; 

    @ManyToOne(optional = false) 
    private Project project; 


    @ManyToOne(optional = false) 
    private Deliverable deliverable; 
} 

且可传送:

@Entity 
public class Deliverable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @Column(name = "short", nullable = false) 
    private String key; 

    @Column(nullable = false) 
    private String name; 

    @OneToMany(targetEntity = Task.class, mappedBy = "deliverable", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JsonIgnore 
    private Collection<Task> tasks; 

    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    @JoinColumn(name = "project") 
    private Project project; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "parent") 
    private Deliverable parent; 

    @OneToMany(targetEntity = Deliverable.class, mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JsonIgnore 
    private Collection<Deliverable> children; 
} 
+0

我提出了一个新问题,可能有助于解决这个问题。请检查它:http://stackoverflow.com/questions/11457292/sql-query-using-hibernate-in-a-restful-web-service – Ali 2012-07-12 17:31:25

+0

该错误表明可能有一个问题与您的Hibernate之间的映射对象。确保你的映射文件中有''和''标签正确。不管你是否有这个映射,我的下面的编辑应该工作。 – FGreg 2012-07-13 16:30:27

+0

我认为映射文件中的标记能正常工作。我检查了几次。 – Ali 2012-07-13 16:40:49

回答

2

我想你是要求从ID排序的Task排名前3 Deliverable s。你可以尝试这样的事情:

编辑:好吧,我会再采取一个刺。这应该给你的前3 Deliverable S按Task.id下令采取只关联到max(Task.id)

deliverables = 
     (List<Deliverable>) session.createQuery(
      "from Deliverable as d, Task as t 
       where t.deliverable.id = d.id and 
       t.id = (select max(t1.id) from Task t1 where t1.deliverable.id = d.id) 
       and d.project.id= :id 
       and t.user.username = :name 
       order by t.id desc") 
     .setMaxResults(3) 
     .setLong("id", projectId) 
     .setString("name", username) 
     .list(); 
+0

好帮手。我以某种方式问你这个问题,你误解了。我正在编辑它。但我想它离我想要的很近。 (这三个交付物不应该重复。) – Ali 2012-07-11 21:17:59

+0

我再次感谢。有冲突,我编辑了这个问题,请你检查一下。 – Ali 2012-07-11 22:48:22

+0

这是一个真正有用的编辑。但我再次发生错误。我不知道为什么。我只是将堆栈跟踪中的错误复制到问题的结尾。也许是因为(... =(从任务t1选择max(t1.id),其中t1.deliverable.id = d.id))在泽西岛可能不支持 – Ali 2012-07-13 15:14:47

1

Deliverable我不知道TOP功能是在MySQL中可用,但尝试使用它,并分享结果。你可以这样写: SELECT TOP 2 * FROM Persons

检查这个链接,它会提供给你更多的细节。 enter link description here

+0

我很欣赏,MySQL中不支持TOP功能。 – Ali 2012-07-12 11:42:13

2

mysql没有TOP,在sql的末尾使用ORDER BY和LIMIT子句。

+0

我与我的朋友@ali检查过,Barmar是正确的。尝试探索如何使用LIMIT。 – Amir 2012-07-12 07:50:26

+0

@ali:现在检查Barmar的答案,我添加了一个如何使用LIMIT的例子。 – Amir 2012-07-12 08:11:56

+0

我尝试了LIMIT,它对我没有帮助。但我猜如果它的工作结果是一样的@FGerg响应。 “.setMaxResults(3)”也会得到相同的结果。 – Ali 2012-07-12 11:46:26