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

14
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对象,这很奇怪吗?

谢谢! Sami

2个回答

30

你的HQL查询无效。LIMIT不是有效的HQL子句。在Hibernate中执行此操作,只需进行如下更改:

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

感谢您的回答!我也遇到了同样的异常:---AsekorjausHelper.getLastLahetysNro()---- INFO: Hibernate:select from order by lahetysNro DESC limit? WARN: SQL错误:1064,SQL状态:42000 ERROR:您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册以使用正确的语法。附近的语句为'from order by lahetysNro DESC limit 1',第1行。 INFO:发生异常----->您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册以使用正确的语法。附近的语句为'from order by lahetysNro DESC limit 1',第1行。 - Sami
1
请参考@RAS的答案。HQL使用实体、映射字段/属性和关联,而不是表名和列名。 - JB Nizet
@JBNizet为什么在setMaxResults(1)时使用uniqueResult()?根据文档,uniqueResult方法返回单个实例。 - Jawad Hassan Soomro
1
uniqueResult() 期望查询返回单个结果,如果不是这种情况,则会抛出异常。 setMaxResult() 告诉数据库将结果限制为单行,然后可以使用 singleResult() 获取该行。 - JB Nizet

8

在使用HQL时,应该指定完整的类名(而不是表名)。同样也应该指定属性名(而不是列名)。另外请注意,两者都区分大小写。

从您的查询和异常信息来看,我猜测lahetys是您的表名,lahetysNro是您的列名。

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

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

对于您的第二个问题:

在这里,您使用了 SQL 而不是 HQL。 当您以这种方式使用 Hibernate 的 SQL 时,它总是返回 List<Object[]> 而不是 List<Lahetys[]>


3
错误解决方案:org.hibernate.hql.internal.ast.QuerySyntaxException: 在第1行附近出现意外的标记:limit....请使用.setMaxResults(1)。 - demon101
3
这个答案不正确。请查看@demon101的评论。 - Kenci
@demon101,我不是在关注limit相关的事情。那是OP使用的,我不在谈论它。我只是解释了OP收到的异常以及他应该如何解决它们。limit的使用完全是另一个点,与此处的上下文无关。 - RAS
这个解决方案不起作用,请取消将其标记为首选答案。 - Jess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接