我的情况是我只需要返回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>
。那么在应用程序中我可以将String
或Object
重新设置为正确的类型int
或float
等等。所以这应该不是问题。
3)现在如果我查询多个员工详细信息(没有where子句),那么查询将是这样的 - (不确定来自后的查询部分是否正确)
List<List<<String>> employeesDetails = session.createQuery("select empMaster.getName(), empMaster.getDesignation() from EmployeeMaster;
无论如何,这里要强调的是将回报类型的变化强调为:List<List<<String>> employeesDetails
。它是这样工作的吗???。
(上面引用的问题也有指向使用预测的答案。我对此有疑问,但会将其发布在另一个问题上,不要混淆。)
答案 0 :(得分: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();
当您执行查询,其SELECT子句包含多个字段,并且您调用uniqueResult()
时,您将获得一个对象数组(Object[]
)。您遍历数组中的每个元素并将其强制转换为相应的类型。
首先,您可能忘记在查询结束时添加.list()
方法调用。
session.createQuery("select empMaster.name, empMaster.designation from EmployeeMaster").list();
否则,查询将不会被执行,您只需要等待触发QueryImpl
个对象。
现在,当您在查询中选择多个结果并选择多个字段时,您将获得List<Object[]>
。列表的元素将是特定记录的字段数组,数组本身就是字段。