【问题标题】:Search by number starts with in spring data jpa按数字搜索以弹簧数据 jpa 开头
【发布时间】:2015-10-29 11:55:47
【问题描述】:

我正在使用 Spring 数据 jpa、MySQL。 我有以下实体

User {
    BigDecimal userNo;
    String name;
}

Mysql 表的样子,

user(userNo decimal(10, 0), name text);

我想搜索所有users 的userNo 以开头的例如 12。 我如何在 Spring Data jpa 中做到这一点。

我试过用,

userDao.findByUserNoStartingWith(BigDecimal userNo);

但它不起作用并抛出异常

org.springframework.dao.InvalidDataAccessApiUsageException: 参数值 [12%] 与预期类型不匹配 [java.math.BigDecimal (n/a)];嵌套异常是 java.lang.IllegalArgumentException:参数值 [12%] 与预期类型不匹配 [java.math.BigDecimal (n/a)]

如何使用派生查询或 jpa 查询进行搜索?

【问题讨论】:

  • 该列是十进制数而不是字符串。
  • 是的,明白了。但是解决方案是什么
  • select * from user where userNo >= 12 ?
  • 它将返回我不想要的 13
  • 嗯也许你没有userNo == 12

标签: java mysql spring-data-jpa


【解决方案1】:

我认为您最好的选择是编写一个类似的查询

select *
from   user
where  cast(userNo as char) like 12%

由于 Spring Data 无法自行生成这样的查询,因此您必须自己指定。由于cast 不是 JPQL,您还必须告诉 Spring Data 它是一个原生 SQL 查询。

public interface UserDao extends JpaRepository<User, BigDecimal> {
    @Query(value = "select u from user u where cast(userNo as char) like :userNo%",
           native = true)
    public List<User> find(@Param("userNo") String userNo);
}

【讨论】:

  • 是否可以进行分页而不是列表?有什么办法吗?
  • 是的,支持分页;请参阅the docs 了解更多信息。
  • 支持分页,但不支持本机查询。并且没有本机查询,我无法对十进制类型执行“startsWith”
  • @Prashant Shilimkar 可以使用 LIMIT、OFFSET 哈哈 ;)
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2019-05-02
  • 2017-07-06
  • 2019-02-26
相关资源
最近更新 更多