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

Java 如何在Hibernate中仅检索部分(少数)pojo字段?,java,hibernate,jpa,Java,Hibernate,Jpa,在这种情况下,我只需要返回POJO的几个字段。 这里有一个关于同样的问题,但似乎没有什么事情是模糊的 1) 答案建议使用- 字符串employeeName=session.createQuery(“从EmployeeMaster empMaster中选择empMaster.name,其中empMaster.id=:id”).setInteger(“id”,10).uniqueResult() 因此,我关心的是——每个pojo字段通常都是私有的,因此“empMaster.name”根本不起作用。我

在这种情况下,我只需要返回POJO的几个字段。 这里有一个关于同样的问题,但似乎没有什么事情是模糊的

1) 答案建议使用-

字符串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();

无论如何,这里的重点是强调返回类型的变化:
List我将按照您提到的顺序列出这些点:

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

    session.createQuery("select empMaster.getName() from EmployeeMaster...");
    
    将引发语法错误:对象的字段名中不能有括号

    顺便说一下,您必须将查询结果解析为字符串,否则将出现编译器语义错误

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

  • 首先,您可能忘记在查询结束时添加
    .list()
    方法调用

    session.createQuery("select empMaster.name, empMaster.designation from EmployeeMaster").list();
    
    否则,查询将不会执行,而您将有一个
    QueryImpl
    对象等待触发

    现在,当您希望查询中出现多个结果并选择多个字段时,您将返回一个
    列表。列表的元素是特定记录的字段数组,数组本身就是字段


  • gr8 hectorricardo,这很有帮助。除非我开始在代码中使用它,否则我无法理解
    empMaster.name
    将如何工作。hibernate解析器如何理解这是什么。除非hibernate使用反射,因此字段的范围无关紧要。在EmployeeMaster定义中,您将有以下内容:
    列(name=“name”)
    字符串名称
    ,hibernate知道
    name
    对应于表中的name列。由于HQL中的查询将转换为普通SQL,因此这与字段的可见性无关。
    session.createQuery("select empMaster.name, empMaster.designation from EmployeeMaster").list();