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

时间:2015-02-25 07:43:10

标签: spring-data spring-data-jpa

我将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 Data会生成一个查询,例如 select * from users where username =?。但由于我的Oracle数据库使用char类型作为列用户名,如果我传入username参数而没有填充足够的空间,我将不会得到任何结果。

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

有没有向Spring Data Jpa添加一些自定义代码,让Spring Data Jpa自动填充空格?我不想再次编写所有查询方法并手动填充空格,因为我在Entity类()中添加了长度。

1 个答案:

答案 0 :(得分:0)

如果您使用Hibernate作为JPA提供程序,可以通过创建Hibernate UserType来实现。

  1. 创建名为CharType的自定义用户类型。在此课程中执行必要的填充和修剪。
  2. 使用CHAR(n)作为支持数据类型注释使用CharType的字段。
  3. 完整的解决方案以及CharType类是available on Github。请参阅Person中的PersonRepositoryTest实体和测试用例,以获取有关如何在您自己的代码中集成此类内容的指导。