【发布时间】:2022-07-11 15:30:56
【问题描述】:
应该是这样的:
+--------+-----+---------+
|name |login|user_type|
+--------+-----+---------+
| |admin|admin |
|John Doe|john |user |
|Jane Doe|janed|user |
|........|.....|.........|
问题是,我的 JPA 技能已经很生疏了,我忘记了如何使用实体管理器。我知道如何进行基本的 JPQL 查询或内置的东西,但遗憾的是这对我来说还不够(因为我需要使用该列表来填充我的 UI 中的表格)。那么,我应该如何使用实体管理器? (如果我应该使用它;))
编辑:现在我认为使用 DTO 投影更好;这是我的映射类
public class PersonUserMap {
private Integer personID;
private String name;
private String login;
private UserType userType;
public Integer getPersonID() {
return personID;
}
public String getName() {
return name;
}
public String getLogin() {
return login;
}
public UserType getUserType() { //custom Enum
return userType;
}
}
我在 People 类中的注释:
@SqlResultSetMapping(
name = "PersonUserMapping",
classes = @ConstructorResult(
columns = { @ColumnResult(name = "personID", type=Integer.class),
@ColumnResult(name = "name"),
@ColumnResult(name = "login"),
@ColumnResult(name = "userType",type = UserType.class)},
targetClass = PersonUserMap.class))
当使用这样的原生查询时:
Query q = entityManager.createNativeQuery("Select p.personid, p.first_name || ' ' || p.last_name as name, u.login, u.user_type from people p join users u on p.user_idusers = u.idusers","PersonUserMapping");
它抛出异常Could not resolve column name in result set [userType]
【问题讨论】:
-
也许更多关于你具体需要的细节。如果您可以执行查询,那么您希望在该技能之外做什么 - “选择 user.login、user.email、来自用户用户的人员...”与“从用户中选择用户”的查询没有太大区别user where..”,或“select person from People”,后者将为您提供人员实例,其中应包括其引用的用户
-
不喜欢元组查询,因为它们必须绕过实体缓存机制,但你所拥有的类似于我建议的第一个连接查询。 "Select p.firstName, p.lastName, u.login, u.userType from People p join p.user u"
-
您为什么使用本机查询 (SQL) 而不是 JPQL 查询? JPQL 让您验证您的查询,这些列随着您的模型更改而存在,并且使用您的实体的开发人员应该更容易阅读和理解。您的 PersonUserMapping 的 userType 定义不正确,因为错误表明您正在强制它查找返回的结果集中不存在的“userType”。您需要它来查找“user_type”,或者将查询更改为返回“userType”。
-
显示它生成的 SQL(打开 SQL 日志记录)和完整的错误。以及数据库和驱动版本
-
我没有注意到您有“from People p join Users u”作为您的查询 - 为什么您没有按照建议使用“from People p join p.user u”? JPA 没有完全连接——它在数据库上没有得到普遍支持,所以只提供右连接和左连接。您应该可以轻松地使您的本机查询工作 - 我在第二篇文章中为您提供了解决方案,其中“userType”不正确,因为“user_type”将被返回。
标签: java hibernate jpa spring-data-jpa