【问题标题】:Hibernate - avoid string in property name when making predicateHibernate - 制作谓词时避免属性名称中的字符串
【发布时间】:2021-09-08 19:19:50
【问题描述】:

我有以下实体:

@Entity
MyClass{

    @Column(length = 6, nullable = true)
    @Type(type = "mypackage.MyInnerClassHibernateType")
    @Mergable
    private MyInnerClass myProperty;

    ...

}

当我需要对myProperty 进行谓词时,我会这样:

criteriaBuilder.equal(queryRoot.get("myProperty"), value);

这很好用,但我不喜欢在查询中使用“myProperty”字符串。如果我重命名属性,我必须遍历所有这些字符串并在那里重命名。我发现这种设计容易出错。

有什么方法可以避免使用硬编码字符串吗?

【问题讨论】:

  • 您需要的是类型安全的元模型。这里描述developer.ibm.com/languages/java/articles/j-typesafejpa
  • 是的,像这样。但是如何将它合并到我的解决方案中?我曾尝试输入queryRoot.get(MyClass_.myProperty),但这显然无法编译。我在这里错过了什么?
  • 您需要在依赖项中包含注释处理器:docs.jboss.org/hibernate/jpamodelgen/1.0/reference/en-US/…。在构建过程中,处理器将自动为您标记有@Entity 注释的类创建元模型。在您的情况下,它将为MyClass 类生成MyClass_
  • 非常感谢,我要试一试。

标签: java hibernate hibernate-criteria


【解决方案1】:

我用完了 Lombok 的@FieldNameConstants

如果你这样注释你的类:

@FieldNameConstants
public class FieldNameConstantsExample {
  private final String iAmAField;
  private final int andSoAmI;
  @FieldNameConstants.Exclude private final int asAmI;
}

然后您可以通过以下方式访问字段名称:

FieldNameConstantsExample.Fields.iAmAField;

返回包含属性名称的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多