首页 > 解决方案 > Hibernate 无法从终端执行可以正常执行的查询

问题描述

我有一个 spring boot 项目(在 linux 上)和一个简单的数据库,它由两个实体组成 - 说法和标签。Saying 可以有多个标签,每个标签可以用来标记多个说法,所以是多对多的关系。表saying_tags用于使用它们的 id 连接说法和标签。

当我尝试使用此查询选择具有精确指定标签的所有语句,并且该查询选择了某些内容(结果不为空)时,休眠会抛出异常,Caused by: java.sql.SQLException: Column 'id' not found.id此查询中甚至不存在列。当我尝试从终端或 DBeaver 执行它时,它工作正常,并返回我所期望的。

我什至尝试使用确切的参数对查询进行硬编码,以确保休眠不会更改查询中的任何内容,但它仍然失败。当休眠将查询记录到控制台时,我从字面上复制了查询,并且它在终端中运行良好。

这是具有硬编码值的查询以及扩展接口内JpaRepository<Saying, Long>执行它的方法:

@Query(value="select saying_id from saying_tags group by saying_id having count(distinct case when tags_id in (33) then tags_id else 0 end) = 1 and min(case when tags_id in (33) then tags_id else 0 end) > 0", nativeQuery=true)
public List<Saying> getSayingsContainingExactlyGivenTags();

标签: sqlhibernatespring-bootjpa

解决方案


您的查询投射一个名为 的标量值saying_id,但您返回的是一个List实体Saying。您的投影应包含Saying实体的所有属性。您可能还需要@SqlResultSetMapping确保将结果集正确映射到实体。


推荐阅读