gpt4 book ai didi

java - 为什么此 JPA 查询中未使用转换器?

转载 作者:行者123 更新时间:2023-12-01 21:26:41 25 4
gpt4 key购买 nike

我有一个实体,其中的属性使用自定义类型:

@Entity
public class Person {
@Id
private Long id;

@Column
private Username username;
}

有一个用户名转换器,可以将其从字符串转换回来:

@Converter(autoApply = true)
public class UsernameConverter implements AttributeConverter<Username, String> {
...
}

在我的 JPA 存储库中,有一些按用户名查询的方法。简单的方法可以工作,但其他方法(例如将值放入数据库函数调用的方法)则不行:

public interface PersonRepository extends JpaRepository<Person, Long> {
// This one works
@Query("select p from Person p where p.username=:username")
Person getPersonByUsername(@Param("username") Username username);

// This one doesn't
@Query("select p from person p where UPPER(p.username)=UPPER(:username)")
List<Person> findPeopleWithUsernamesLike(@Param("username") Username username);
}

第一种方法有效,但第二种方法会导致异常:

org.hibernate.HibernateException: Could not determine a type for class: org.myorg.myapp.people.type.Username

为什么会失败?是否有文档说明在什么情况下参数将被转换?我知道,使用@Id注释的属性和 native 查询,不会执行参数转换。这似乎不是其中任何一个。

最佳答案

您定义的转换器是 JPA 功能,因此处理它发生在 JPA 方面。

Spring Data JPA 不知道这些转换器,因此不应用它们。在将任何内容传递给 JPA 实现之前,Spring 会解释第二个查询中的 SpEL 表达式。

为了使其正常工作,您可以在 SpEL 表达式的 EvaluationContext 中注册转换器的实例,或者使转换方法在 Person 对象本身中可用,并且在 SpEL 中调用它。您可以在 blog article introducing SpEL expressions for annotated queries 中找到更多详细信息。 .

关于java - 为什么此 JPA 查询中未使用转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com