【问题标题】:Using QueryDSL to access properties in a type-safe manner使用 QueryDSL 以类型安全的方式访问属性
【发布时间】:2013-10-29 10:01:45
【问题描述】:

我已经在一个项目中使用 QueryDSL,并且想知道是否可以(ab)使用它来使我的 POJO 到 JSON 转换类型安全。目前我做这样的事情:

converter.toJson(entity, entity.getDetail(), "detail");

我想如果我能把它改成这样会很酷:

QEntity q = QEntity.entity;
converter.toJson(entity, q.detail);

然后,在 toJson 方法中使用 q.detail 参数来提取属性的名称以及调用实体上的 getter 来检索值.使用 EntityPathBase.getType().getSimpleClassName() 并使用 getter 的反射应该是可行的,但我想知道 QueryDSL 是否已经可以做到这一点。

结果我使用了 Path.getMetadata().getName(),它可用于查询实体并返回给定示例中的属性名称。结合 BeanMap 来检索属性值(正如 Timo 所建议的,谢谢!)。现在我不必让 getter 调用与字符串同步。当然这是一种权衡,因为现在使用反射,牺牲一些性能以获得更好的可维护性。

【问题讨论】:

  • 你有这个转换器的代码在某个地方共享或者你可以共享它吗?我的项目中需要类似的功能,如果我能对此有所了解,那就太好了。谢谢! @jotomo
  • @avaz 代码对手头的任务相当专业,所以我将简要介绍一下它的工作原理。转换器使用Jackson构建树(使用ObjectMappercreateObjectcreateArrayNode方法)并使用上面的Path.getMetadata( ).getName() 来构建属性的名称。执行此操作的方法然后简单地传递一个查询实体,例如addPropertyToNode(node, entity, q.address.streetname)。 HTH。 (来源已关闭,抱歉)。
  • 感谢您的洞察力,我想我可以按照这个方向进行操作,我会有所收获,问候!

标签: querydsl


【解决方案1】:

你可以使用 Querydsl Collections GuavaHelpers class http://www.querydsl.com/static/querydsl/3.2.4/apidocs/com/mysema/query/collections/GuavaHelpers.html 来做类似的事情

虽然我不确定在这种情况下是否需要类型安全,因为您的目标模型 (JSON) 不是静态类型的。

如果您的用例是将 bean 属性复制到 JSON 结构,我可能只使用 Bean 辅助类(例如 BeanMap)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2010-09-10
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多