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

在我们的实体bean中,我们使用自定义ID格式,其中包含校验和以验证ID实际上是否有效. Ids看起来像ID827391738979.为了确保所有代码只使用正确的ID,我们在ID String周围创建了一个代码包装器:

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

笔记:

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

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...