在我们的实体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
类,而不是使用字符串。
答案 0 :(得分:10)
您可以使用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
}
}
注意:
@Id
。packageToScan
上的属性EntityManagerFactoryBean
中。