如何在Hibernate中只检索部分(少数)pojo字段?

时间:2018-01-21 06:45:41

标签: java hibernate jpa

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

1)答案建议使用 -

  

String employeeName = session.createQuery("从EmployeeMaster empMaster中选择 empMaster.name ,其中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<String>   2(a)希望这是对的?
  2(b)如果我对int类型的员工的年龄/工资感兴趣,该怎么办?我认为返回类型为List<String>List<Object>。那么在应用程序中我可以将StringObject重新设置为正确的类型intfloat等等。所以这应该不是问题。

3)现在如果我查询多个员工详细信息(没有where子句),那么查询将是这样的 - (不确定来自后的查询部分是否正确)

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

无论如何,这里要强调的是将回报类型的变化强调为:List<List<<String>> employeesDetails。它是这样工作的吗???。

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

1 个答案:

答案 0 :(得分:1)

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

  1. 该查询与POJO的字段可见性无关。您正在对数据库进行简单查询,就像使用SQL进行查询一样,表中的列与其映射的POJO&#39;无关。应用程序中的字段是公共的或私有的。区别仅在于您使用的语言:现在您正在使用Hibernate查询语言(HQL),它允许您表达与POJO相关的查询。定义而不是数据库的表格&#39;定义。事实上,正在做

    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<Object[]>。列表的元素将是特定记录的字段数组,数组本身就是字段。