”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > ## JPQL 中的构造函数表达式:使用还是不使用?

## JPQL 中的构造函数表达式:使用还是不使用?

发布于2024-11-08
浏览:404

## Constructor Expressions in JPQL: To Use or Not to Use?

JPQL 中的构造函数表达式:有益还是有问题的实践?

JPQL 提供了使用构造函数表达式在 select 语句中创建新对象的能力。虽然此功能提供了某些优势,但它引发了关于其在软件开发实践中是否适用的问题。

构造函数表达式的优点

构造函数表达式允许开发人员从实体中提取特定数据并进行组装,从而简化了数据检索将它们转换为任意类的新对象。与返回值数组相比,这提高了类型安全性和可读性。当检索数据以在持久性上下文之外进行显示或操作时,它特别有用。

潜在缺点

但是,有些人认为构造函数表达式引入了不必要的复杂性,并可能导致代码臃肿。它们还可能通过阻止持久性提供程序基于实体映射进行优化来阻碍查询优化。此外,如果返回的对象不表示持久实体并且未附加到会话,构造函数表达式可以创建孤立实体。

使用理由

构造函数表达式的使用在场景中是合理的其中以类型安全的方式检索特定数据集至关重要。这包括:

  • 填充 DTO 或数据传输对象以在表示层或 API 中使用。
  • 从实体中过滤和提取特定属性,而不检索整个实体图。
  • 创建表示从持久数据派生的聚合或摘要信息的临时对象。

避免滥用和优化

为了避免潜在的陷阱,开发人员应该:

  • 谨慎使用构造函数表达式,重点关注利大于弊的场景。
  • 避免使用构造函数表达式创建持久实体,因为这可能会导致孤立对象。
  • 通过确保所选属性相关并避免不必要的联接,使用构造函数表达式优化查询。
  • 考虑使用 JPQL 子查询来实现相同的结果,而无需创建新对象。
最新教程 更多>
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-23
  • 如何在不使用链接的情况下向 Span 元素添加工具提示?
    如何在不使用链接的情况下向 Span 元素添加工具提示?
    向不带链接的 Span 元素添加工具提示将鼠标悬停在 span 元素上时,通常需要向用户提供附加信息。这可以使用工具提示来实现,而不依赖于链接。解决方案:要使用内置 HTML 属性将工具提示添加到 span 元素,只需按如下方式使用 title 属性:<span title="My ...
    编程 发布于2024-12-23
  • 为什么我的 WebSocket 服务器在 Docker 化后无法连接?
    为什么我的 WebSocket 服务器在 Docker 化后无法连接?
    Docker化 WebSocket 服务器问题开发人员在尝试使用 Docker 容器化 WebSocket 服务器时遇到问题。服务器代码使用“connected”写入新连接,并且在容器外运行良好,但当放置在 Docker 容器内时,客户端会由于“连接重置”错误而出现恐慌,并显示错误消息“read t...
    编程 发布于2024-12-23
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-23
  • Python中如何导入同目录或子目录中的类?
    Python中如何导入同目录或子目录中的类?
    在Python中从同一目录或子目录导入类在Python中,您可以通过以下方式从同一目录或子目录中的文件导入类利用 __init__.py 文件。该文件是一个空占位符,指示该目录包含模块和包。从同一目录导入从与 main 相同的目录中的文件导入类.py,在该目录中创建一个 __init__.py 文件...
    编程 发布于2024-12-23
  • 为什么C90中函数名可以用作函数指针?
    为什么C90中函数名可以用作函数指针?
    使用函数名称作为函数指针C90 的基本原理文档深入了解了将函数名称与函数指针等同的设计选择。这种便利简化了在特定上下文中使用函数指针的过程。函数声明考虑声明:int f(); int (*pf)();函数调用以下所有表示有效的函数调用:(&f)(); f(); (*f)(); (**f)()...
    编程 发布于2024-12-23
  • 如何在 Python 中使用多个单词边界分隔符将字符串拆分为单词?
    如何在 Python 中使用多个单词边界分隔符将字符串拆分为单词?
    使用多个单词边界定界符将字符串拆分为单词处理文本数据时,常见的任务是将字符串拆分为单个单词。 Python 的 str.split() 方法提供了一个简单的解决方案,但它仅支持单个分隔符作为其参数。在处理包含多种类型的单词边界(例如标点符号)的文本时,此限制可能会成为障碍。Python re 模块提...
    编程 发布于2024-12-23
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-23
  • 为什么 Selenium 在 Chrome 中定位元素时会抛出“NoSuchElementException”?
    为什么 Selenium 在 Chrome 中定位元素时会抛出“NoSuchElementException”?
    "NoSuchElementException" for Chrome with SeleniumIssue尝试在 Chrome 上使用 Selenium 与 QWOP 交互时,始终出现错误消息: selenium.common.exceptions.NoSuchElementE...
    编程 发布于2024-12-23
  • 为什么Java中的静态方法不能是抽象的?
    为什么Java中的静态方法不能是抽象的?
    为什么Java中静态方法不能是抽象的在Java编程中,静态方法不能是抽象的。抽象方法意味着该方法有声明但没有实现,将其留给子类来提供功能。但是,无论是否创建对象实例,静态方法本质上都与类本身相关联。以下示例演示了抽象静态方法的问题:abstract class foo { abstract ...
    编程 发布于2024-12-23
  • 如何将 Qt 调试输出重定向到文件?
    如何将 Qt 调试输出重定向到文件?
    重定向 Qt 调试输出调试 Qt 应用程序时,大量的 qDebug() 和相关语句可能会因过多的调试输出而使控制台变得混乱。对此,开发人员经常寻求一种跨平台的方法来将此输出重定向到文件。Qt方式:qInstallMessageHandlerQt提供了更方便的处理方法使用 qInstallMessag...
    编程 发布于2024-12-23
  • Lambda 与列表推导式:哪种最适合 Python 列表中的元素差异?
    Lambda 与列表推导式:哪种最适合 Python 列表中的元素差异?
    在列表中执行逐元素差异:Lambda 与列表理解查找列表中相邻元素之间的差异是常见操作编程。在 Python 中,有多种方法可以实现此目的,包括使用 lambda 表达式或列表推导式。Lambda 表达式:可以使用 lambda 表达式创建函数动态,然后可用于对列表中的每个元素进行操作。例如:t =...
    编程 发布于2024-12-23
  • 为什么我的 Java HttpClient 文件上传到 PHP 服务器失败,如何使用 MultipartEntity 修复它?
    为什么我的 Java HttpClient 文件上传到 PHP 服务器失败,如何使用 MultipartEntity 修复它?
    使用 PHP 通过 Java 的 HttpClient 上传文件在尝试利用 PHP 将文件从 Java 上传到 Apache 服务器时,利用 Jakarta 创建了一个 Java 应用程序HttpClient 库版本 4.0 beta2。然而,PHP 脚本无法识别上传的文件,导致 $_FILES 数...
    编程 发布于2024-12-23
  • 如何使用 PIVOT 运算符在 SQL Server 中转置数据?
    如何使用 PIVOT 运算符在 SQL Server 中转置数据?
    如何使用 PIVOT 转置 SQL Server 数据SQL Server 中的 PIVOT 运算符允许您将行转换为列,将数据从垂直方向的形式变为水平方向的形式。当寻求基于多个属性汇总数据时,这非常有用。示例数据和所需输出考虑以下起始数据集:SELECT Name1, Name2, Value FR...
    编程 发布于2024-12-23
  • Go 中是否有类似于缓冲通道的缓冲锁定模式?
    Go 中是否有类似于缓冲通道的缓冲锁定模式?
    Go 中的缓冲锁定模式在 Go 中,缓冲通道允许通信继续进行而不会阻塞,直到缓冲区填满。然而,是否存在类似的缓冲锁模式来限制对特定数量的客户端的资源访问?管理对资源的并发访问的原语是信号量。使用缓冲通道可以轻松实现信号量。这里有一个示例:var semaphore = make(chan struc...
    编程 发布于2024-12-23

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3