【问题标题】:How to use field name of one class in a method of another class, such that get compiler issue if name is changed如何在另一个类的方法中使用一个类的字段名称,这样如果名称更改会出现编译器问题
【发布时间】:2020-01-08 16:07:34
【问题描述】:

我想将一个 java 类中的字段名引用到另一个类,这样当有人更改基类中的字段名时,我至少会得到编译器错误。

例如:

@Entity
class Employee {

    public String userId;
    public String timestampCreate;

}

class EmployeeReport {

    public Page<Employee> getEmployees() {

        return page = employeeJpaRepository.findAll(pageNumber, pageSize,
                Sort.by(Sort.Direction.DESC, "timestampCreate"));

    }

}

这里timestampCreate是Employee类的字段名。

我不想硬编码列名;因为这是不好的做法,并且希望它能够成为未来的证明,以防字段名称发生变化。 例如,如果有人将列名“timestampCreate”更改为“timestamp”,那么至少我希望在 EmployeeReport 类中看到一些编译器错误。

请提出一个想法。 谢谢!

注意:我打开这个类似于前一个,因为它被错误地关闭说重复,而如果你能看到标记的答案无处回答我的问题!

【问题讨论】:

    标签: java spring jpa spring-data-jpa spring-data


    【解决方案1】:

    您不能开箱即用,但可以使用注释或反射。 IMO 这些对于这种用例来说是丑陋的解决方案,有关更多详细信息,请参阅以下答案。 nameof equivalent in Java

    【讨论】:

    • 感谢您的正确指点!我认为这是一件微不足道的事情,现在明白了;遗憾的是,我们没有直接的 fwd 解决方案。很好的信息。
    【解决方案2】:

    您可以通过使用 Querydsl 或 JPA 元模型来实现这一点。基本思想是您注册一个 APT,该 APT 将生成元模型类型,这些元模型类型依次将实体的字段公开为属性。例如。 Hibernate APT 将创建一个类型Employee_,其中包含一个公共字段timestampCreate。然后,您可以使用这些属性通过

    构建类型安全的Sort 实例
    new JpaSort(Employee_.timestampCreate)
    

    您甚至可以使用JpaSort 上的静态path 方法构建嵌套路径:

    new JpaSort(JpaSort.path(Department_.head).dot(Employee_.timestampCreate));
    

    假设有一个额外的实体类型Department,其属性head 类型为Employee

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2020-03-08
      • 2018-03-05
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多