我需要将非规范化查询的结果重新规范化为类层次结构。
这不是我可以使用JPA的原因,因为查询很复杂并且需要Oracle特定的功能,例如查询提示,窗口函数等。
我提供了一个大规模简化的例子,但实际上会涉及更多的表和字段。
SELECT e.id,
e.name,
c.id,
c.name
FROM employee e
LEFT JOIN car c ON e.id = c.employee_id;
|1|Robert Martin|1|BMW |
|1|Robert Martin|2|Mercedes|
|2|Joshua Bloch |3|Lexus |
|2|Joshua Bloch |4|Audi |
我想重新规范化上面的表,持久层(在本例中为querydsl-sql)将作为List<Tuple>
返回到下面的结构中。
public class Employee {
private final long id;
private final String name;
private final List<Car> cars;
}
public class Car {
private final long id;
private final String name;
}
我能想到的最简单的方法是处理服务层中的数据,分离每个实体的字段并根据主键获取不同的字段 - 我将使用Java 8流API。
然而,这感觉就像编写和维护的许多脆弱,重复的代码/单元测试一样,并且是一个必须多次解决的问题。
是否有实现这一目标的最佳实践方法,或者某些流行的框架可以提供这种开箱即用的东西?
提前感谢您的反馈!
修改
如果没有任何更好的想法,我继续使用Java 8 Streams API重新规范化,利用map
和Collectors.groupingBy
。代码易于编写,读取良好且易于测试。