当前位置: 首页 > 面试题库 >

在Hibernate中使用本地SQL查询将结果集放入DTO

赫连法
2023-03-14
问题内容

我有一个如下查询

select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id

如果可以使用HQL,则可以使用HQL构造函数语法直接用结果集填充DTO。但是,由于hibernate状态不允许在没有关联的情况下进行左联接,因此我必须使用本机SQL查询。

目前,我正在遍历JDBC样式的结果集并填充DTO对象。有没有更简单的方法来实现它?


问题答案:

您也许可以使用结果转换器。引用Hibernate3.2:HQL和SQL的变压器:

SQL变形金刚

使用本机sql返回非实体bean或Map通常比basic更为有用Object[]。使用结果转换器,现在成为可能。

>     List resultWithAliasedBean = s.createSQLQuery(
>       "SELECT st.name as studentName, co.description as courseDescription "
> +
>       "FROM Enrolment e " +
>       "INNER JOIN Student st on e.studentId=st.studentId " +
>       "INNER JOIN Course co on e.courseCode=co.courseCode")
>       .addScalar("studentName")
>       .addScalar("courseDescription")
>       .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
>       .list();
>  
>     StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);

提示:addScalar()HSQLDB要求调用以使其与属性名称匹配,因为它以全大写形式返回列名称(例如“
STUDENTNAME”)。这也可以通过搜索属性名称而不是使用完全匹配的自定义转换器来解决-也许我们应该提供FuzzyAliasToBean()方法;)

参考文献

  • hibernate参考指南
    • 16.1.5。返回非托管实体
  • hibernate的博客
    • Hibernate 3.2:HQL和SQL的变形金刚


 类似资料:
  • 我需要通过在Hibernate中执行本机查询获得结果集。虽然我使用的是EntityManager,但查询和结果集可能不是实体。 当我尝试下面的代码时,我得到了一个结果。因为我要求的是一个有值的结果。(Hibernate JPA) 结果是:爱丽丝 当我试图从相同的代码中获得多个select out(查询为select name)时,指定来自fresher_test(其中id=1) 这有一种方法,我可

  • 我有SQL查询,结果是多行多列。 我想执行此查询并将结果放入

  • 背景:我有一个目录,其中包含许多导入SQL服务器的文件。 任务:创建PowerShell脚本,该脚本将拾取此目录中的文件,并使用SQL查询中的文件名。 最终目标:除了显示文件名之外,显示SQL结果,但显示的结果集也应该显示服务器中没有条目SQL文件。类似于SQL服务器查询中的。 Powershell代码 到目前为止完成的工作:我已经能够使用Get-ChildItem获取文件名并循环它们以获取查询结

  • 问题内容: 无论如何,SQL Server中是否可以确定结果集中Mgmt Studio的查询中查询返回的数据的MEGS大小? 问题答案: 您可以打开客户端统计信息(“查询”菜单,“包括客户端统计信息”),该统计信息提供了执行查询时从服务器返回的字节数。

  • 问题内容: 是否可以将本机SQL查询的结果映射到Grails域类实例的集合? 问题答案:

  • 问题内容: 我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。 我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。 一些领域是 shopping_id(primary key) store_id user_id 现在,我想要的是-对于给定的一组商店,找到访问该商店的最大次数的前5位用户。 我可以一次在1个商店中进行以