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

标签 java hibernate jpa

我遇到了一种情况,我只需要返回 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 字段通常都是私有(private)的,因此 "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 子句),那么查询将类似于 - (不确定 from 之后的查询部分是否正确)

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

无论如何,这里要强调的是返回类型更改为:List<List<<String>> employeesDetails。这样可以吗???.

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

最佳答案

我将按照您提到的顺序列出要点:

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

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

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

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

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

关于java - 如何在 Hibernate 中仅检索部分(少数)pojo 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48364354/

相关文章:

java - 在 Java 中打开 Microsoft Word

java - 为什么使用 StringBuffer 后无法使用 toLowerCase() ?

java - 使用 HQL 进行条件更新

java - 以关键字作为名称截断表

java - JPA vs ORM vs Hibernate?

java - 从数据库读取时 JPA 字符串为 boolean 值

java - 在 Spring 中将 JPA EntityManager 和 Hibernate session 与共享事务管理器一起使用

java - PHP加法运算

spring - 实体 : Autowired is null 中的计算字段

java - 嵌入式tomcat与spring集成