如何使用休眠查询仅获取具有关联的实体的某些字段?

2024-01-20

我有一个具有多个字段的实体,其中一些是关联。 假设该实体具有与以下类似的结构:

@Entity
@Table(name="foos")
public class Foo {

  public Foo() {}
  @Id
  private Long id;

  @Column
  private String name;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "bar_id")
  private Bar bar;

  @ManyToOne
  @JoinColumn(name = "bar1_id")
  private Bar1 bar1;

  @ManyToOne
  @JoinColumn(name = "bar2_id")
  private Bar2 bar2;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
  @JoinColumn(name = "foo_id")
  private List<Bar3> bar3;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
  @JoinColumn(name = "foo_id")
  private List<Bar4> bar4;

  //getters and setters
}

我的问题是如何使用 Hibernate 查询仅加载某些字段而不加载整个实体?
我只想获取 id、bar、bar1 和 bar3,并且不想获取创建的 Foo 对象中的其余字段(name、bar2、bar4)。
我对 Hibernate 还很陌生,所以任何建议将不胜感激。


休眠 5、春季 5

您有多种选择,但最简单的选择是使用所需的列/字段创建一个简单的 @Query,请参阅我的项目之一中的示例代码。

首先,您不需要创建带有子集字段的 DTO,我将显示这两个版本和混合版本的选项。

选项一:具有列/字段子集的 DTO 对象。

DTO 存储库代码:

@Query( "SELECT new com.your.package.name.customers.CompanyDTOIdName(c.id, c.name) " +
        "FROM Company c " +
        "WHERE c.enabled = 1 " +
        "ORDER BY c.name ASC"           )
List<CompanyDTOIdName> compDtoNameWhereEnabledTrue();

DTO 子集对象:

public class CompanyDTOIdName {

    private long id;
    private String name;

    public CompanyDTOIdName(long id, String name) {
        this.id = id;
        this.name = name;
    }

    // accessors/mutators methods
}

Hibernate SQL执行代码:

SELECT
    new com.your.package.name.customers.CompanyDTOIdName(c.id, c.name) 
FROM
    Company c 
WHERE
    c.enabled = 1 
ORDER BY
    c.name ASC
            
select
    company0_.companyId as col_0_0_,
    company0_.name as col_1_0_ 
from
    ome_company company0_ 
where
    company0_.enabled=1 
order by
    company0_.name ASC

主要缺点是您需要一个单独的 DTO 对象来包含每个不同的列组合。


选项二:使用原始@Entity

您的第二个选项更简单,并且适用于任何列子集,如下所示:

存储库代码:

@Query( "SELECT new com.your.package.name.customers.Company(c.id, c.name) " +
        "FROM Company c " +
        "WHERE c.enabled = 1 " +
        "ORDER BY c.name ASC"
)
List<Company> compNameWhereEnabledTrue();

其中 Company 是您的原始 @Entity 对象。

在这种情况下,您的 Entity 对象必须包含空构造函数以及与您的 @Query 语句匹配的构造函数:

public void Company() {}
public void Company(Long id, String name) { /* code omitted */ }

Hibernate SQL执行代码:

SELECT
    new com.your.package.name.customers.Company(c.id, c.name) 
FROM
    Company c 
WHERE
    c.enabled = 1 
ORDER BY
    c.name ASC

select
    company0_.companyId as col_0_0_,
    company0_.name as col_1_0_ 
from
    ome_company company0_ 
where
    company0_.enabled=1 
order by
    company0_.name ASC

注意:我相信您可以看到这种方法的问题。仅加载指定的列/字段。如果您尝试访问非启动字段,您将收到异常。


使用接口的混合版本(两全其美)

创建具有所需访问器字段的接口。

public interface CompanyDTOIdNameInterface {
    
    public Long getId();
    public String getName();
}

在 @Entity 对象上实现接口。

public class Company implements Serializable,
                                CompanyDTOIdNameInterface
{ /* omitted code */ }

存储库代码:

@Query( "SELECT new com.your.package.name.customers.Company(c.id, c.name) " +
            "FROM Company c " +
            "WHERE c.enabled = 1 " +
            "ORDER BY c.name ASC"
    )
    List<CompanyDTOIdNameInterface> compNameWhereEnabledTrue();

就这么简单。祝你好运 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用休眠查询仅获取具有关联的实体的某些字段? 的相关文章

随机推荐

  • scala泛型函数返回类型

    我尝试编写一个具有通用返回类型的函数 但除非我强制转换返回类型 否则它不起作用 请看函数getSomething 下面我预计它无需铸造即可工作 我在这里可能做错了什么 trait Sup class Sub extends Sup def
  • 如何使用 jQuery 触发自定义事件?

    我将自定义事件处理程序附加到body在 jQuery 中ready method 随后我立即trigger自定义事件 但似乎什么也没有发生 function body on test function alert test triggere
  • 如何将外部JS文件加载到moodle中?

    如何将外部JS文件加载到moodle中 使用moodle api 即moodle库 在Moodle 2 0中我一直使用 PAGE gt requires gt js 首先 使 PAGE通过执行以下操作可用于您的代码 require once
  • Chisel 中的 <> 运算符是什么?

    Chisel 教程使用了看似 lt gt 运算符 对我来说完全陌生 它有什么作用 还有 它从哪里来 该运算符在其他 Scala 库甚至其他语言中是否有约定的含义 以下是 Chisel Generator Bootcamp 练习第 3 2 节
  • 注册时创建子域

    我正在建立一个网站 企业可以在其中注册自己的帐户 该帐户应位于http businessname example com http businessname example com 企业名称 每次都在变化 我想在 Windows 服务器 I
  • 身份验证模式=“表单”导致 WCF 端点出现错误

    我的 NET 4 0 Web 应用程序项目中有一个 WCF 端点 使用VS2010 WCF测试客户端 我可以正确连接到该服务 但是 当我使用该服务时 我收到一条通用错误消息 内容类型text html 响应消息的 charset UTF 8
  • 在 XDebug 会话中 cURL 到 self

    我正在使用 XDebug 在 Eclipse 中调试 PHP 应用程序 应用程序通过 cURL 调用自身内部的 HTTP API Current protocol server port URL http SERVER SERVER NAM
  • 为 Firefox 签署基于 XUL 的附加组件

    是否可以对基于 XUL 的 Firefox 附加组件进行签名 或者只能使用新的 SDK 进行签名 所有扩展 无论是Overlay https developer mozilla org en US Add ons Overlay Exten
  • Pylint 错误检查可以定制吗?

    我正在使用 pydev 我已经设置了 pylint 问题是 即使在评论中 pylint 也会报告警告 我希望禁用任何行或块注释内的任何类型的检查 另外 我希望遵循驼峰命名约定 而不是代码中变量和参数的下划线 有没有办法指定这样的规则 而不用
  • 使用转义引号解析 JSON 时出错

    当我从浏览器调用 URL 时 我收到以下 json 对象 我希望其中没有数据 data SkipToken top 然而 当我尝试用 javascript 调用它时 它给了我error Parsing Json message dspser
  • Oracle 中的观察者模式

    我可以设置更改或添加表中某些行的钩子 并在发生此类事件时以某种方式收到通知吗 我发现了网络 但只被管道困住了 但是没有办法在发送管道消息时立即获取它 只有期刊尝试接收 通常应该避免从数据库实现观察者模式 为什么 它依赖于供应商专有 非标准
  • 提高 data.table 日期+时间粘贴的性能?

    我不确定我是否可以在这里问这个问题 请告诉我是否应该在其他地方这样做 我有一个包含 1e6 行的 data table 具有以下结构 V1 V2 V3 1 03 09 2011 08 05 40 1145 0 2 03 09 2011 08
  • 未找到命令 - bash:sqlplus:

    我正在尝试在 Oracle 数据库 docker 容器中使用 sqlplus 用于Windows 10 给出的命令 docker run d p 8080 8080 p 1521 1521 name OracleDB store oracl
  • 是否可以只用一名协调员启动一些 oozie 工作流程?

    我不确定是否可以使用这个好工具来实现我想要的目的 我有很多工作流程 这些工作流程可以是依赖的 也可以是非依赖的 示例 workflow1 工作流程 xml job properties workflow2 工作流程 xml job prop
  • 在适用于 Android 的 Visual Studio 模拟器中使用代理

    以下是模拟器公告的链接 包含在 Visual Studio 15 CTP 中 https www visualstudio com en us msft android emulator vs aspx https www visualst
  • 什么是 XLSHTML?

    什么是 XLSHTML 我想尽可能简单地生成一个文件 当用户双击该文件时 该文件将在 Excel 中打开 并且具有一些最小的样式 XLS满足我的用户要求 但生成起来并不容易 CSV 很容易生成 但没有样式 HTML 很容易生成并具有样式 但
  • PDO::FETCH_CLASS 具有多个类

    我正在尝试将查询结果转换为类 result gt setFetchMode PDO FETCH CLASS myclass array 这工作得很好 但是类名myclass取决于列值 是否可以获取每一行并根据行值将其转换为不同的类 用户示例
  • Windows 上的 git bash shell “您编辑的块不适用”(续)

    不久前 我问这个问题 https stackoverflow com questions 41917746 git bash shell on windows your edited hunk does not apply noredire
  • 自定义默认“新存储过程”SSMS 2008 模板

    我正在尝试自定义您单击时放置的默认查询New Stored Procedure 来自Object Explorer在 SQL Server Management Studio 2008 上 我找到了如何更改 创建存储过程 新菜单 模板Tem
  • 如何使用休眠查询仅获取具有关联的实体的某些字段?

    我有一个具有多个字段的实体 其中一些是关联 假设该实体具有与以下类似的结构 Entity Table name foos public class Foo public Foo Id private Long id Column priva