使用Spring Data JPA自动转换参数

在我们的实体bean中,我们使用自定义ID格式,其中包含校验和以validationID实际上是否有效。 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类而不是使用字符串。

您可以在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 { @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. 不幸的是, 如果该字段也应该用@Id注释 , 它将无法工作 。
  3. 如果使用EclipseLink,则必须在persistence.xml中定义转换器,否则它不会选择它。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=412454
  4. 使用Spring上的JPA,包含转换器的包必须出现在EntityManagerFactoryBean上的属性packageToScan中。