Spring crud 存储库按不区分大小写的字符串排序

Posted

技术标签:

【中文标题】Spring crud 存储库按不区分大小写的字符串排序【英文标题】:Spring crud repository sorting by case insensitive string 【发布时间】:2016-07-07 09:46:53 【问题描述】:

我的 crud 存储库界面是:

public interface BookRepository extends CrudRepository<BookEntity, String> 

    List<BookEntity> findByLibraryIdOrderByNumberAsc(long libraryId);

我想通过它们所在图书馆的 id 获取书籍实体的列表,但也按一些名为 number 的字段排序,它是一个字符串(因为它可能看起来像 'ISBN-12356'),并按升序排序,但顺序也应不区分大小写。

我假设这可以在 SQL 中使用

完成
select * from Books where libraryId = ?  order by lower(number) ASC

Spring Crud 存储库中是否有与此等效的方法,可以通过使用方法名称来实现,而不涉及本机 SQL 的具体定义?

感谢您的帮助。

【问题讨论】:

为了确保我做对了,您想在不使用任何Query 注释并且只使用方法名称约定的情况下实现此功能?使用findByLibraryIdOrderByNumberAsc,您可以获得结果,但它会导致区分大小写的搜索?并且您希望它不区分大小写。是吗? 【参考方案1】:

我猜你需要创建 JPQL 查询:

public interface BookRepository extends CrudRepository<BookEntity, String> 

    @Query("select books from BookEntity books where libraryId = ?1  order by lower(number) ASC")
    List<BookEntity> findByLibraryIdOrderByNumberAsc(long libraryId);

【讨论】:

我会投赞成票,因为该解决方案仅通过“业务逻辑”公开所需的参数,而我决定使用的解决方案期望获得一个排序对象。【参考方案2】:

我找到的解决方案是使用以下方法:

 List<BookEntity> findByBookId(long libraryId, Sort sort);

然后为了使用此方法,您可以使用如下所示的排序对象:

public static final Sort SORT_BY_NUMBER = new Sort(new Sort.Order(Sort.Direction.ASC, "number").ignoreCase());

【讨论】:

以上是关于Spring crud 存储库按不区分大小写的字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

Spring数据存储库按列分组,包含其他列的对象列表

mysql模糊查询区分大小写

MySQL UTF-8 常用字符排序规则

对数组中的字符串不区分大小写的NSPredicate?

字符串属性的 gql 查询中不区分大小写的 where 子句

Spring Data REST 是不是支持响应式 crud 存储库?