自定义查询

当查询结果无法对应到实体时(如:统计类的查询),无法使用Spring Data JPA提供的封装方法完成查询工作。开发人员只需使对应的Repository实现RepositoryEnhancer接口,即可进行自定义的查询。

class Foo {
    Long id;
    String name;
}
interface FooRepository extends RepositoryEnhancer {
}

StringBuilder sb = new StringBuilder("select t from Foo as t where 1=1 ");
Map<String, Object> parameters = new HashMap<>();
if (StringUtils.isNotEmpty(fooQo.getName())) {
    sb.append("    and t.name = :name");
    parameters.put("name", fooQo.getName());
}
List<Foo> count = fooRepository.findByJpql(sb.toString(), parameters);

RepositoryEnhancer提供的方法如下(暂不支持SQL):

  • createQuery(String):Query

  • createQuery(String, Class<T>):TypedQuery<T>

  • createNativeQuery(String):Query

  • createNativeQuery(String, Class<T>):Query

  • findByJpql(String):List

  • findByJpql(String, Map):List

  • findByJpql(String, Object[]):List

  • findByJpql(String, Class<T>):List<T>

  • findByJpql(String, Map, Class<T>):List<T>

  • findByJpql(String, Object[], Class<T>):List<T>

  • getOrderByFragment(Class<?>, Sort, Map):String

  • getColumnName(Class<?>, String):String

其中:createQuery相关方法可以获取Query对象,用户自行执行查询操作;findByJpql使用JPQL语法进行查询。查询操作均支持Map或者数组形式传入参数。getOrderByFragment方法可以根据Sort对象生成order by子句,getColumnName方法可以根据属性名获取对应的数据库列名。

Last updated