SQL查询与MySQL

前端之家收集整理的这篇文章主要介绍了SQL查询与MySQL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Jesey在Java(JAX-RS)中实现Restful Web Service.我在Tomcat v7.0上运行它我使用Hibernate将数据映射到数据库(MysqL).我有一个查询获取可交付成果列表:
  1. deliverables = (List<Deliverable>) session.createQuery("Select deliverable from
  2. Task as t where t.project.id= :id And t.user.username = :name")
  3. .setLong("id",projectId).setString("name",username).list();

它给了我一百个可交付成果,但我希望在Task表中有TOP三.我感谢任何帮助.我该如何修改查询

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

与@FGreg的答案存在冲突.当我使用这些查询时,一切正常:

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

我认为在@FGreg提供的查询中,不考虑max(id),例如,task_id = 31,643使用了两次可交付成果.可能会认为Task_id = 31,这是错误的.有任何帮助来解决它吗?

我试过没有明显的@FGreg查询.然后它除了重复问题以外工作正常.

我试过这个:

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

我在堆栈跟踪中得到了New Error:

  1. Jul 13,2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
  2. ERROR: Path expected for join!
  3. Jul 13,2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
  4. ERROR: Path expected for join!
  5. Path expected for join!
  6. at org.hibernate.hql.internal.ast.HqlsqlWalker.createFromJoinElement(HqlsqlWalker.java:371)
  7. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.joinElement(HqlsqlBaseWalker.java:3477)
  8. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromElement(HqlsqlBaseWalker.java:3263)
  9. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromElementList(HqlsqlBaseWalker.java:3141)
  10. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromClause(HqlsqlBaseWalker.java:694)
  11. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.query(HqlsqlBaseWalker.java:550)
  12. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.selectStatement(HqlsqlBaseWalker.java:287)
  13. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.statement(HqlsqlBaseWalker.java:235)
  14. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
  15. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
  16. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
  17. at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
  18. at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
  19. at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119)
  20. at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214)
  21. at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192)
  22. at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537)
  23. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  24. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  25. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  26. at java.lang.reflect.Method.invoke(Unknown Source)
  27. at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350)
  28. at $Proxy65.createQuery(Unknown Source)
  29. at se.softwerk.timelog.controller.DeliverableManager.deliverableList2(DeliverableManager.java:185)
  30. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  31. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  32. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  33. at java.lang.reflect.Method.invoke(Unknown Source)
  34. at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
  35. at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponSEOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
  36. at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
  37. at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
  38. at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
  39. at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
  40. at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
  41. at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
  42. at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
  43. at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
  44. at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
  45. at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
  46. at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
  47. at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
  48. at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
  49. at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  50. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
  51. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  52. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
  53. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
  54. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
  55. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
  56. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
  57. at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
  58. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  59. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
  60. at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
  61. at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
  62. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
  63. at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  64. at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  65. at java.lang.Thread.run(Unknown Source)
  66.  
  67. Jul 13,2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
  68. ERROR: Invalid path: 't.id'
  69. Jul 13,2012 5:03:10 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
  70. ERROR: Invalid path: 't.id'
  71. Invalid path: 't.id'
  72. at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:131)
  73. at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:219)
  74. at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:118)
  75. at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114)
  76. at org.hibernate.hql.internal.ast.HqlsqlWalker.resolve(HqlsqlWalker.java:883)
  77. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.expr(HqlsqlBaseWalker.java:1246)
  78. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.exprOrSubquery(HqlsqlBaseWalker.java:4252)
  79. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.comparisonExpr(HqlsqlBaseWalker.java:3730)
  80. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.logicalExpr(HqlsqlBaseWalker.java:1923)
  81. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.logicalExpr(HqlsqlBaseWalker.java:1848)
  82. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.logicalExpr(HqlsqlBaseWalker.java:1848)
  83. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.whereClause(HqlsqlBaseWalker.java:782)
  84. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.query(HqlsqlBaseWalker.java:583)
  85. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.selectStatement(HqlsqlBaseWalker.java:287)
  86. at org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.statement(HqlsqlBaseWalker.java:235)
  87. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
  88. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
  89. at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
  90. at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
  91. at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
  92. at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119)
  93. at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214)
  94. at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192)
  95. at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537)
  96. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  97. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  98. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  99. at java.lang.reflect.Method.invoke(Unknown Source)
  100. at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350)
  101. at $Proxy65.createQuery(Unknown Source)
  102. at se.softwerk.timelog.controller.DeliverableManager.deliverableList2(DeliverableManager.java:185)
  103. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  104. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  105. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  106. at java.lang.reflect.Method.invoke(Unknown Source)

模型类:

  1. @Entity
  2. public class Task {
  3.  
  4. @Id
  5. @GeneratedValue
  6. private long id;
  7.  
  8. @ManyToOne(optional = false)
  9. private User user;
  10.  
  11. @ManyToOne(optional = false)
  12. private Project project;
  13.  
  14.  
  15. @ManyToOne(optional = false)
  16. private Deliverable deliverable;
  17. }

并且可交付:

  1. @Entity
  2. public class Deliverable {
  3.  
  4. @Id
  5. @GeneratedValue
  6. private long id;
  7.  
  8. @Column(name = "short",nullable = false)
  9. private String key;
  10.  
  11. @Column(nullable = false)
  12. private String name;
  13.  
  14. @OneToMany(targetEntity = Task.class,mappedBy = "deliverable",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
  15. @JsonIgnore
  16. private Collection<Task> tasks;
  17.  
  18. @ManyToOne(optional = false,fetch = FetchType.EAGER)
  19. @JoinColumn(name = "project")
  20. private Project project;
  21.  
  22. @ManyToOne(fetch = FetchType.EAGER)
  23. @JoinColumn(name = "parent")
  24. private Deliverable parent;
  25.  
  26. @OneToMany(targetEntity = Deliverable.class,mappedBy = "parent",cascade = CascadeType.ALL)
  27. @JsonIgnore
  28. private Collection<Deliverable> children;
  29. }

解决方法

我想你要求按ID排序的前3个可交付成果.你可以尝试这样的事情:

编辑:好的,我会再多拿一次.这应该为您提供由Task.id订购的前3个可交付物,仅获取与max相关的Deliverable(Task.id)

  1. deliverables =
  2. (List<Deliverable>) session.createQuery(
  3. "from Deliverable as d,Task as t
  4. where t.deliverable.id = d.id and
  5. t.id = (select max(t1.id) from Task t1 where t1.deliverable.id = d.id)
  6. and d.project.id= :id
  7. and t.user.username = :name
  8. order by t.id desc")
  9. .setMaxResults(3)
  10. .setLong("id",projectId)
  11. .setString("name",username)
  12. .list();

猜你在找的MsSQL相关文章