【问题标题】:Spring Data JPA/Hibernate - using EntityManager for queriesSpring Data JPA/Hibernate - 使用 EntityManager 进行查询
【发布时间】: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


【解决方案1】:

感谢@Chris 的帮助,我终于找到了地方;我的集合映射如下所示:

@SqlResultSetMapping(
    name = "PersonUserMapping",
    classes = @ConstructorResult(
        columns = { @ColumnResult(name = "personid", type=Integer.class),
            @ColumnResult(name = "name"),
            @ColumnResult(name = "login"),
            @ColumnResult(name = "user_type",type = UserType.class)},
        targetClass = PersonUserMap.class))

我的查询看起来像这样

Query q = entityManager.createNativeQuery("select personid, concat(first_name, ' ', last_name) as 'name', users.login, users.user_type from aspirejestracja.people"
                + " full join aspirejestracja.users on user_idusers = users.idusers ", "PersonUserMapping");

现在我可以显示我需要的所有用户 :)

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2020-03-16
    相关资源
    最近更新 更多