如何向 Spring Data Jpa 生成的查询添加一些自定义行为?

How to add some custom behavior to Spring Data Jpa generated query?

我正在使用 Spring Data Jpa 和旧的 Oracle 数据库。我们的一些表使用 char 而不是 varchar2 类型。当我使用 Spring Data Jpa 生成的查询时,这会导致一些问题。

例如,我有一个名为 User

的实体
@Entity
@Table(name = "USERS")
public class User implements Serializable {

    private static final long serialVersionUID = -4054737587007197812L;

    @Id
    private Long userId;
    @Column(columnDefinition = "char", length = 12)
    private String username;
}

我的 UserRepository 是这样的:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    public User findByUsername(String name);
}

像往常一样,Spring 数据将从用户名 = ? 的用户生成类似 select * 的查询。但是由于我的 Oracle 数据库对用户名列使用 char 类型,如果我在没有足够填充的情况下传入用户名参数,我将不会得到任何结果 space.

userRepository.findByUsername("Chris") -> not result
userRepository.findByUsername("Chris[with 7 spaces]") -> 1 result

是否可以向 Spring Data Jpa 添加一些自定义代码并让 Spring Data Jpa 自动填充 spaces?我不想再次编写所有查询方法并手动填充 space 因为我已经在实体 class ().

中添加了长度

如果您使用 Hibernate 作为 JPA 提供程序,这可以通过创建 Hibernate UserType.

  1. 创建名为 CharType 的自定义用户类型。在此 class.
  2. 中执行必要的填充和修剪
  3. 使用 CHAR(n) 注释字段作为支持数据类型以使用 CharType

一个完整的解决方案,连同 CharType class available on Github. See the Person entity and test cases in PersonRepositoryTest 用于指导如何将类似的东西集成到您自己的代码中。