首页 新闻 会员 周边

ibernate原生SQL只查询个别字段转实体类时报错:ERROR org.hibernate.util.JDBCExceptionReporter - 列名 name 无效。

0
悬赏园豆:100 [待解决问题]

Java hibernate代码:

StringBuilder sb = new StringBuilder();
sb.append("SELECT u.ID ID FROM dbo.USER u ");
List<User> list = this.getSession().createSQLQuery(sb.toString()).addEntity(User.class).list();


错误信息:
[catalina-exec-1-1]WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: S1093
[catalina-exec-1-1] ERROR org.hibernate.util.JDBCExceptionReporter - 列名 name 无效。

错误原因:
User实体中有name字段,而查询SQL没有name字段。

问题:
我就只想查询ID字段,不想查询NAME字段,怎么办呢?
主要我现在即使在SQL中加上了NAME字段,万一后续USER表又加了个AGE字段,岂不是这个SQL又要报错了?
如何才能只查询某几个字段呢?

友善的穿山甲兄弟的主页 友善的穿山甲兄弟 | 初学一级 | 园豆:104
提问于:2023-10-16 17:27

不要用 User 类。新建一个 POJO,只包含 id 属性,试试。

快乐的凡人721 6个月前

@快乐的凡人721: 需要用User类,后续需要操作这个类。用新的POJO类,即使成功了也没用。

友善的穿山甲兄弟 6个月前
< >
分享
所有回答(3)
1

这是hibernate与原生sql的问题,就是要实体与表字段一一对应起来;
解决方式:
如果你这种需求很多,即查询sql与实体不对应的情况很多,可以考虑使用hql;可参考:https://www.cnblogs.com/sunjf/p/hibernate_HQL.html
如果不多,那就查询所有列。

Ctrl` | 园豆:3317 (老鸟四级) | 2023-10-16 18:06

HQL会自动查询所有列,但我就想只查询某几个列,没有很好的办法。

支持(0) 反对(0) 友善的穿山甲兄弟 | 园豆:104 (初学一级) | 2023-10-17 10:18
0

在Hibernate中,如果你只想查询实体类中的某几个字段而不想查询整个实体类,可以使用以下方法:

使用addScalar方法:
java

StringBuilder sb = new StringBuilder();
sb.append("SELECT u.ID FROM dbo.USER u ");
List<User> list = this.getSession()
.createSQLQuery(sb.toString())
.addScalar("ID", LongType.INSTANCE) // 指定要查询的字段和字段的数据类型
.list();
使用addScalar方法允许你显式指定要查询的字段以及它们的数据类型,这样你不必担心后续表结构的变化。

使用构造函数表达式:
你还可以创建一个构造函数表达式,以便在查询时构造一个特定字段的实体对象。这适用于情况,如果你需要查询多个字段并将它们映射到一个自定义的实体类中。

首先,创建一个构造函数在你的实体类中:

java

public User(Long id) {
this.id = id;
}
然后,修改你的SQL查询如下:

java

StringBuilder sb = new StringBuilder();
sb.append("SELECT new com.example.User(u.ID) FROM dbo.USER u ");
List<User> list = this.getSession().createSQLQuery(sb.toString()).list();
在上述示例中,我们使用new com.example.User(u.ID)来构造一个User实体对象,只包含ID字段。这种方式也允许你选择性地映射你所需要的字段。

这两种方法中,你可以根据需求选择更合适的方式来查询部分字段,而不必担心整个实体类的字段是否与查询匹配。

Technologyforgood | 园豆:5698 (大侠五级) | 2023-10-16 19:42

两个都没用,直接报错了。

支持(0) 反对(0) 友善的穿山甲兄弟 | 园豆:104 (初学一级) | 2023-10-17 10:15
0

返回的时候List<User> 改成 List<Long> 试试呢

好大一只蓝胖子 | 园豆:202 (菜鸟二级) | 2023-11-03 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册