【问题标题】:Any way to make hibernate query return key-value map automatically (omit "as")?有什么方法可以让休眠查询自动返回键值映射(省略“as”)?
【发布时间】:2015-05-25 14:02:37
【问题描述】:

由于存储在 Mysql 中的数据总是有一个列名,我认为如果有一种方法可以检索键值映射中的记录,那就太好了。

Join 查询的 Hibernate 机制帮不上太大忙,因为我们只能检索Object[] 结果并自己反序列化结果,或者我们可以使用this

这在与选择新地图一起使用时最有用:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat

上面的查询给出了一种获取map的方法,但是我们要定义map的key(用as),我觉得只是一个case-by-case的解决方案,不是很优雅到hard - 编码字段名称。

我们找到一种仅使用列名自动定义检索到的地图的key 的方法不是更好更通用吗?那么我们可以发送一个包含所有字段的地图并让应用程序选择使用哪个字段吗?

【问题讨论】:

    标签: java mysql sql hibernate dictionary


    【解决方案1】:

    即使有这样的功能,Hibernate 又如何决定哪个是 Map 键以及来自 Map 值的哪些列。

    最灵活的解决方案是定义一个 DTO,用于保存选定的投影:

    select new my.package.DTO(field1, field2, .., fieldn) from ...
    

    您只需将结果传递给custom result transformer,其中包含确切的结果集键映射逻辑。

    【讨论】:

    • 感谢您的回复,DTO 定义是个好主意,但仍应随着表列的变化对其进行修改。
    • 如果我们将 compute 字段(例如 count、max、min...)放在一边,我们可以使用列名作为键。大多数情况下,检索没有 computing 字段的字段是最常用的,至少在我们的应用程序中是这样。
    • 如果需要,为什么不直接将 ${column}_max 或 ${column}_min 命名为键?似乎hibernate还没有这样做,但我认为如果他们添加这个功能将是一个很好的帮助。
    • 如果您更改列名,则无论如何都必须更新映射和任何本机查询,这只是偶尔发生的事件。 DTO 可以使用别名,因此即使您更改列名,别名也将保持不变,因此您不必更改应用程序逻辑。
    • 你可以在 Hibernate 论坛上开一个工单来请求这样的功能,但是由于已经有 2000 个开工工单,你最好自己实现它并向 Hibernate 核心团队提交一个拉取请求。
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2013-04-30
    • 2013-11-07
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多