gpt4 book ai didi

java - 使用 hibernate 命名查询和 spring 填充 DTO 的 List 属性

转载 作者:行者123 更新时间:2023-12-01 04:56:49 26 4
gpt4 key购买 nike

我想知道使用 hibernate 是否可以实现以下目标。考虑以下 DTO:

public class ClassDTO {
private String className;
private List<String> studentNames;
//getters & setters
}

以及以下包含 sql 查询的 hbm 文件:

<hibernate-mapping>
<class name="app.ClassDTO">
<id name="className" type="java.lang.String" />
<property name="studentNames" type="java.lang.List" />
</class>

<sql-query name="classQuery">
<return alias="class" class="app.ClassDTO" />
select classTable.CLASS_NAME AS {class.className}, ST.STUDENT_NAME
from CLASS classTable
join STUDENT ST on ST.CLASS_ID=classTable.CLASS_ID
where ST.age<18
</sql-query>
</hibernate-mapping>

如果我们在数据库中运行查询,我们将得到以下结果:

+----------+------------+
|CLASS_NAME|STUDENT_NAME|
+----------+------------+
| CS106 | BILL |
| CS106 | GEORGE |
| CS106 | MICHEL |
| ELEC8 | WILL |
| ELEC8 | MIKE |
| ELEC8 | BETTY |
+----------+------------+

如果我们在 hibernate 中运行查询,我们应该获得 ClassDTO 对象的列表。但是否可以通过以下方式初始化这些对象?

List<ClassDTO> result = getHibernateTemplate.findByNamedQuery("classQuery").;
resul.size(); //<-- the list size should be 2 (one entry for CS106 and another for ELEC8)
result.get(0).getStudentNames().size(); //<-- the size should be 3 for BILL, GEORGE and MICHEL who are linked to the class CS106

我已经搜索了 hibernate 文档,但尚未成功找到任何答案。非常感谢任何帮助。提前谢谢大家。

最佳答案

如果您进一步规范化数据并调整映射,您可以让 Hibernate 自动执行此操作:

<class name="app.ClassDTO">
<id name="className" type="java.lang.String" />
<list name="studentNames" table="class_student">
<key column="class_name" />
<element type="string"/>
</list>
</class>

我承认,如果唯一存在的数据确实是这两列,那么标准化似乎很愚蠢。但在很大程度上,让 Hibernate 自动将平面表数据转换为复杂的对象结构需要遵循某些规则(在这种特殊情况下,我不会将其称为最佳实践)。

如果您想让表保持原样,那么您需要自己创建 ClassDTO,这实际上并不难:

final List<Object[]> resultObjects = getSession().getNamedQuery().list();
public Map<String, ClassDTO> resultMap = new HashMap<>(String, ClassDTO);
for (Object[] result : resultObjects) {
// find ClassDTO in map for class, or create new one
// add student name to class dto instance
}

关于java - 使用 hibernate 命名查询和 spring 填充 DTO 的 List 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com