【问题标题】:POJO getter returning JPQL query result?POJO getter 返回 JPQL 查询结果?
【发布时间】:2017-07-03 08:40:33
【问题描述】:

如果这是一个糟糕的问题,我很抱歉,但我想知道 POJO 是否可以让 getter 返回 JPQL 查询结果? 在构造函数中进行赋值会更好吗?

public Long getCount() {
 Long count = 0L;
    if (date != null) {
        count = (Long) entityManager.createNamedQuery(query)
                .setParameter(1, someCriteria.getId())
                .setParameter(2, someDate)
                .getSingleResult();
    } else {
        count = (Long) entityManager.createNamedQuery(query)
                .setParameter(1, someCriteria.getId())
                .getSingleResult();
    }
    return count;
}

【问题讨论】:

  • 我认为在你的模型中依赖存储库/服务是一个糟糕的设计。

标签: java jpa jpql pojo


【解决方案1】:

不,一般来说,我个人认为通过 getters 方法执行复杂的操作并不是一个坏习惯。这与信息隐藏和复杂性隐藏有关。调用者只需调用“getThat()”,操作背后的复杂性对调用者完全隐藏。

不同的考虑因素是性能和效率。如果 getter 执行的操作很昂贵,您应该考虑一些优化策略。根据具体情况,您可以将结果存储在本地变量、本地数据库中,或应用其他类型的策略来避免每次调用 getter 时重新计算结果。这一切都取决于结果的含义、结果变化的速度以及应用程序获取最新值的重要性。

【讨论】:

  • 我对 POJO 的确切定义没有清晰的了解。但我希望一个称为 POJO 的对象(取决于上下文)是一个简单的业务对象。我希望此类对象中的 getter 返回其实例变量(或其派生变量)中可用的值,但不执行对持久层的调用。我会将这段代码放入数据访问对象的 finder 方法中,以避免让其他开发人员感到惊讶(我认为这是代码异味)。