java - 使用 Spring Data JPA 自动转换参数

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

在我们的实体 bean 中,我们使用自定义 ID 格式,其中包括校验和以验证 ID 是否确实有效。 ID 看起来像 ID827391738979。为了确保所有代码仅使用正确的 ID,我们围绕 ID 字符串创建了一个代码包装器:

class ID {
    public ID(String id) {
       // parse and verify ID
    }

    public String toString() {
       return id;
    }
}

所有代码都只使用这个ID 对象。然而,在我们的实体中,我们将 ID 定义为 String:

class SomeEntity {
    @Column
    private String itsID;
}

现在我们想使用 Spring-Data-JPA 通过它的 id 来查询一些对象。所以我们这样做:

public SomeEntity findByItsID(ID itsId);

问题是,现在 Spring Data JPA 尝试将 ID 类型的参数分配给查询,而查询当然需要 String

在将参数插入查询之前,是否可以让 Spring Data JPA 将参数转换为预期类型(例如,通过注册 Spring 转换器)?或者,我们是否必须让该方法采用这样的字符串:

public SomeEntity findByItsId(String itsId);

我宁愿避免这种情况,所以所有代码都可以使用 ID 类而不是求助于字符串。

最佳答案

你可以使用 custom type in your entity with JPA 2.1 @Convert ,因此 JPA 会为您进行转换(我也使用 Spring Data JPA 对其进行了测试,并且它透明地工作!),请参阅:

实体:

@Entity
class SomeEntity {

    @Column(name = "my_id_column_name")
    @Convert(converter = MyIDConverter.class)
    private ID itsID;
}

转换器:

public class MyIDConverter implements AttributeConverter<ID, String> {

    @Override
    public String convertToDatabaseColumn(ItStaticDataKey javaKey) {
        // your implementation here
    }

    @Override
    public ItStaticDataKey convertToEntityAttribute(final String databaseKey) {
        // your implementation here
    }

}

注意事项:

  1. 确保您使用的是与 JPA-2.1 兼容的 Spring Data JPA 版本。 (我确信 Spring Data JPA 1.7.0(及更高版本)是(或至少应该)兼容的)。
  2. 不幸的是,it won't work if that field should also be annotated with @Id .
  3. 如果您使用 EclipseLink,则必须在 persistence.xml 中定义转换器,否则它不会选取它。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=412454 .
  4. 对于 Spring 上的 JPA,包含转换器的包必须出现在 EntityManagerFactoryBean 的属性 packageToScan 中。

关于java - 使用 Spring Data JPA 自动转换参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22965178/

相关文章:

java - 无法在 Hibernate 中从父级集合中删除分离的子级

java - Collection 类中奇怪的控制语句

java - 使用java中的SAX解析器从XML中获取所有标签和值

java - 从头开始设计大型 Java webapp 的建议

xml - 无法解析匹配的构造函数(提示 : specify index/type/name arguments for simple parameters to avoid type ambiguities)

java - Play Framework 2.0.4,Java : compound primary key declaration and assignment

java - JPA:如何根据 ID 以外的字段值获取实体?

java - 如何从 Java 生成 RTF?

java - 如何处理更新 Google App Engine 上的 JDO 类定义

java - EclipseLink 错误 : Entity class has no primary key specified. 它应该定义 @Id、@EmbeddedId 或 @IdClass