【问题标题】:How to retrieve only part (few) of pojo fields in Hibernate?如何在 Hibernate 中仅检索部分(少数)pojo 字段?
【发布时间】:2018-01-22 07:57:20
【问题描述】:

我有一种情况,我只需要返回 POJO 的几个字段。 这是一个关于相同问题的SOF Question: retrieve-single-field-rather-than-whole-pojo-in-hibernate 问题,但似乎仍有一些事情是模糊的。

1) 答案建议使用 -

String employeeName = session.createQuery("select empMaster.name from EmployeeMaster empMaster where empMaster.id = :id").setInteger("id",10).uniqueResult();

所以,这是我关心的问题 - 每个 pojo 字段通常都是私有的,所以 "empMaster.name" 根本不起作用。并且不确定 empMaster.getName() 是否是解决此问题的方法。调用 getter 方法会起作用吗?

2)如果我要查询多个字段(这是我的情况)(假设 getter 方法有效),查询将类似于 -

List<String> employeeDetails = session.createQuery("select empMaster.getName(), empMaster.getDesignation() from EmployeeMaster empMaster where empMaster.id = :id").setInteger("id",10).uniqueResult();

请注意,返回类型已从 String 更改为 List&lt;String&gt;
2(a) 希望这是对的吗?
2(b) 如果我对int 类型的员工的年龄/薪水感兴趣怎么办。我认为返回类型将是List&lt;String&gt;List&lt;Object&gt;。无论如何,我可以在应用程序中将StringObject 重新转换为正确的类型intfloat 等。所以这应该不是问题。

3) 现在,如果我要查询多个员工详细信息(没有 where 子句),那么查询将类似于 - (不确定 from 之后的查询部分是否正确)

List<List<<String>> employeesDetails = session.createQuery("select empMaster.getName(), empMaster.getDesignation() from EmployeeMaster;

不管怎样,这里的重点是要强调将返回类型更改为:List&lt;List&lt;&lt;String&gt;&gt; employeesDetails。是这样的吗???。

(上面引用的问题也有指向使用投影的答案。我对此有疑问,但会在另一个问题上发布,不想混淆。)

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我会按照你提到的顺序列出要点:

    1. 查询与 POJO 的字段可见性无关。您正在对数据库进行简单的查询,就好像您正在使用 SQL 进行查询一样,并且表中的列与其在应用程序中映射的 POJO 的字段是公共的还是私有的这一事实无关。不同之处仅在于您使用的语言:现在您使用的是 Hibernate 查询语言 (HQL),它允许您根据 POJO 的定义而不是数据库表的定义来表达您的查询。其实做

      session.createQuery("select empMaster.getName() from EmployeeMaster...");
      

      会抛出语法错误:对象的字段名中不能有括号。

      顺便说一句,你必须将你的查询结果解析为一个String,否则会出现编译器语义错误。

      String name = (String) session.createQuery("select empMaster.name from EmployeeMaster...").setYourParameters().uniqueResult();
      
    2. 当您执行其 SELECT 子句包含多个字段的查询并调用 uniqueResult() 时,您将获得一个对象数组 (Object[])。您遍历数组中的每个元素并将其转换为相应的类型。

    3. 首先,您可能忘记在查询末尾添加.list() 方法调用。

      session.createQuery("select empMaster.name, empMaster.designation from EmployeeMaster").list();
      

      否则,查询将不会被执行,而您只会有一个 QueryImpl 对象等待被触发。

      现在,当您期望查询中有多个结果并选择多个字段时,您将返回 List&lt;Object[]&gt;。列表的元素将是特定记录的字段数组,而数组本身就是字段。

    【讨论】:

    • gr8 hectorricardo,这有帮助。除非我开始在代码中使用它,否则我无法理解 empMaster.name 将如何工作。 hibernate 解析器如何理解这是什么。
    • 除非 hibernate 使用反射,所以字段的范围几乎没有关系。
    • 在您的 EmployeeMaster 定义中,您将拥有:Column(name = "NAME") String name 通过这个注解,hibernate 知道 name 对应于表中的 NAME 列。并且由于HQL中的查询会被转换成普通的SQL,这与字段的可见性无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多