CrudRepositories - 执行前的@Query进程查询参数

时间:2017-02-17 07:55:12

标签: hibernate jpa spring-boot

这是一个简单的界面

public interface HPCrudRepository<T,ID extends Serializable>{

    @Query("<how to write query here")
    public List getThis(String somevalue);

}

在上面的示例中,参数someValue无法直接传递给查询。我必须做一些预处理(比如用逗号或管道符号分割)。

如何预处理参数变量

2 个答案:

答案 0 :(得分:2)

我认为没有针对您的要求的解决方案。但是如果你不想创建自己的实现类,你可以直接在界面中进行预处理。

在Java 8中添加了default关键字,该关键字使功能能够在接口方法中使用逻辑。

因此,您可以创建一个预处理方法,然后调用接口的正确Query-Method。

public interface UserRepository extends JpaRepository<User, Long>{

    @Query("Select u from User u where u.name = :s")
    User findUserByName(@Param("s") String s);

    default User findUserByNamePreprocessing(String s) {
        //do you reprocessing stuff here..
        return this.findUserByName(s);
    }
}

然后您可以决定是否需要直接调用查询或使用预处理查询。

 User user = repo.findUserByNamePreprocessing("Username");

对于小而简单的预处理要求,我认为这是一个简单易用的解决方案。如果它变得复杂,请创建一个实现类。

答案 1 :(得分:0)

不完全是您正在寻找的解决方案,但您可以将自定义behaviour添加到Spring数据存储库。

首先创建一个单独的界面

public interface HPCrudRepositoryCustom {
    public void customMethod();
}

然后提供执行处理的实现。

public class HPCrudRepositoryImpl implements HPCrudRepositoryCustom {

    @Autowired
    HPCrudRepository hpCrudRepository; 

    public void customMethod(String somevalue) {
       // process someValue
       ...
       hpCrudRepository.getThis(processedOutcome);
    }
}

您还可以查看一些示例example1example2