如何使用 Hibernate 从 Mysql 获取最后一条记录?

Posted

技术标签:

【中文标题】如何使用 Hibernate 从 Mysql 获取最后一条记录?【英文标题】:How to get last record from Mysql using Hibernate? 【发布时间】:2012-10-15 16:50:22 【问题描述】:
List<Lahetys> last = session.createQuery("from lahetys order by lahetysNro DESC LIMIT 1").list();

在我得到的日志中:

INFO: Hibernate: select  from order by  lahetysNro DESC LIMIT 1
WARN: SQL Error: 1064, SQLState: 42000
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your       mysql server version for the right syntax to use near 'from order by  lahetysNro DESC LIMIT 1' at line 1

“来自 LAHETYS”发生了什么?使用 HQL 或/和 SQL 处理该问题的最佳做法是什么?

另一个问题:

Lahetys last = (Lahetys)session.createSQLQuery("select * from lahetys order by lahetysNro DESC LIMIT 1").uniqueResult();
session.getTransaction().commit();  

我得到一个例外:

Ljava.lang.Object; cannot be cast to Lahetys 

所以我不能将对象投射到我的 Lahetys 对象上,奇怪吗?

谢谢! 萨米人

【问题讨论】:

【参考方案1】:

您的 HQL 查询无效。 LIMIT 不是有效的 HQL 子句。要在 Hibernate 中做到这一点,只需这样做

Query query = session.createQuery("from lahetys order by lahetysNro DESC");
query.setMaxResults(1);
Lahetys last = (Lahetys) query.uniqueResult();

【讨论】:

感谢您的回答!我也遇到了同样的异常:---AsekorjausHelper.getLastLahetysNro()---- 信息:休眠:按 lahetysNro DESC 限制从订单中选择?警告:SQL 错误:1064,SQLState:42000 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“from order by lahetysNro DESC limit 1”附近使用正确的语法信息:异常发生----->您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“from order by lahetysNro DESC limit 1”附近使用正确的语法 见@RAS 答案。 HQL 使用实体、映射字段/属性和关联。从不使用表名和列名。 @JBNizet 为什么在根据文档 uniqueResult 方法返回单个实例时使用 uniqueResult() 和 setMaxResults(1) uniqueResult() 期望查询返回单个结果,如果不是这种情况则抛出异常。 setMaxResult() 告诉数据库将结果限制为单行,然后我可以使用 singleResult() 获得。【参考方案2】:

当您使用 HQL 时,您应该指定完全限定的 className 而不是 tableName。同样的方式你应该指定propertyName而不是columnName。另请注意,两者都区分大小写。

查看您的查询和遇到的异常,我假设 lahetys 是您的表名,而 lahetysNro 是您的列名。

您应该使用例如:如果您的 Lahetys 类位于 com 文件夹:

List<Lahetys> last = session.createQuery("from com.Lahetys order by lahetysNro DESC LIMIT 1").list();

第二个问题:

这里您使用的是 SQL 而不是 HQL。 当您以这种方式将 SQL 与 hibernate 一起使用时,它总是返回 List&lt;Object[]&gt; 而不是 List&lt;Lahetys[]&gt;

【讨论】:

错误的解决方案:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: limit near line 1.... 使用 .setMaxResults(1) 这个答案不正确。请参阅 @demon101 的评论。 @demon101,我这里不关注limit 相关的事情。那是 OP 使用过的东西,我不是在谈论它。我只是在解释 OP 收到的异常以及他应该如何修复它们。 limit 的使用是完全不同的一点,在这里也与上下文无关。 此解决方案不起作用,请取消将其标记为首选答案。

以上是关于如何使用 Hibernate 从 Mysql 获取最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hibernate、Spring、JSP 中从 db 中获取多行?

如何将 Hibernate 从 MySQL 迁移到 SQL Server?

如何在 MySQL 上使用 Hibernate 批量插入递增的 ID?

如何使用 @ID 和 @GeneratedValue 从 Hibernate + JPA 中的序列中获取 Oracle 生成的值

Spring boot第一个项目 Springboot + mysql + hibernate

Hibernate:如何从具有多个类的查询中获取结果