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又要报错了?
如何才能只查询某几个字段呢?
这是hibernate与原生sql的问题,就是要实体与表字段一一对应起来;
解决方式:
如果你这种需求很多,即查询sql与实体不对应的情况很多,可以考虑使用hql;可参考:https://www.cnblogs.com/sunjf/p/hibernate_HQL.html
如果不多,那就查询所有列。
HQL会自动查询所有列,但我就想只查询某几个列,没有很好的办法。
在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字段。这种方式也允许你选择性地映射你所需要的字段。
这两种方法中,你可以根据需求选择更合适的方式来查询部分字段,而不必担心整个实体类的字段是否与查询匹配。
两个都没用,直接报错了。
返回的时候List<User> 改成 List<Long> 试试呢
不要用 User 类。新建一个 POJO,只包含 id 属性,试试。
– 快乐的凡人721 1年前@快乐的凡人721: 需要用User类,后续需要操作这个类。用新的POJO类,即使成功了也没用。
– 友善的穿山甲兄弟 1年前