当前位置: 首页 > 知识库问答 >
问题:

用Spring Data JPA自动转换参数

陈博容
2023-03-14
class ID {
    public ID(String id) {
       // parse and verify ID
    }

    public String toString() {
       return id;
    }
}
class SomeEntity {
    @Column
    private String itsID;
}

现在我们要使用Spring-Data-JPA根据某个对象的ID查询它。所以我们这样做:

public SomeEntity findByItsID(ID itsId);

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

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

public SomeEntity findByItsId(String itsId);

共有1个答案

王兴庆
2023-03-14

您可以使用JPA2.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. 不幸的是,如果该字段也使用@id.
  3. 进行注释,则不会起作用。
  4. 如果您使用EclipseLink,您必须在persistence.xml中定义converter,否则它不会接收它。https://bugs.eclipse.org/bugs/show_bug.cgi?id=412454.
  5. 在Spring上使用JPA,包含转换器的包必须出现在EntityManagerFactoryBean上的属性PackageToscan中。
 类似资料:
  • 这是一个小问题,但我还是快疯了。 我正在为一个<代码> 问题是当这被渲染时,

  • null 是否可以让Spring将JSON字符串转换为MyMessage的实例,或者我应该放弃,将其作为字符串读取并自己执行转换?

  • 问题内容: MySQL是否会自动将字符串转换为数字值? 转换如何进行? ‘1234’= 1234吗? ‘1abc’= 1? ‘文本’= 1? 给定那是bigint类型的,该查询将如何解释? 问题答案: 前三个问题的答案是:是,是和否。 当字符串转换为数字时,它将成为value 。 描述类型转换的文档在这里。 对于您的查询: 该摘录摘自文档: 在所有其他情况下,将参数作为浮点数(实数)进行比较。 换

  • 在 HTML 文件中,有两个字符需要特殊处理: < 和 & 。 < 符号用于起始标签,& 符号则用于标记 HTML 实体,如果你只是想要显示这些字符的原型,你必须要使用实体的形式,像是 &lt; 和 &amp;。 & 字符尤其让网络文档编写者受折磨,如果你要打「AT&T」 ,你必须要写成「AT&amp;T」。而网址中的 & 字符也要转换。比如你要链接到: http://images.google.

  • 在使用自动进行隐式转换时出错。 使用int变量捕获v.size()的返回是可以的,但自动会出现问题。编译器错误确实表明这是由于转换范围缩小所致。但我想从内存的角度理解这是如何发生的,为什么auto不允许它这样做,而正常转换是可以的 由于以下行自动大小=int{v.size()}导致的错误; 主要的cpp:In函数“int main()”:main。cpp:11:27:错误:“v.std::vect

  • 问题内容: 因此,我所处的状态是以PDF格式发布了一堆数据,但更糟糕的是,大多数(全部?)PDF似乎都是在Office中键入的字母,打印/传真然后进行扫描(我们的政府最好吗?)。起初我以为自己疯了,但后来我开始看到大量“倾斜”的pdf文件,就像有人没有正确将它们放在扫描仪上一样。因此,我想从中获得实际文本的下一个最佳方法就是将每一页变成一张图像。 显然,这需要自动化,如果可能的话,我宁愿使用Pyt