java - 使用数据库函数的JPA查询使用特定索引

标签 java jpa spring-data spring-data-jpa postgresql-9.3

我有一个名为vehicle的表,其中有一列名为VIN。 用户需要能够根据 VIN 的最后 6 个字符进行搜索。 所以我在 Postgres 中添加了一个索引,如下所示:

  CREATE INDEX "ix_vin_last_6" ON vehicle(RIGHT(vin,6));

我添加了一些测试记录如下:

LAST6VIN_A_123456
LAST6VIN_B_123456
LAST6VIN_C_123456

使用SpringDataJPA存储库,这是查询上述测试记录的一种方法:

List<Vehicle> findByVinEndingWith(String vin)

但是上面生成的 JPA 查询使用了 LIKE 子句,如下所示:

where
    vehicle0_.vin like ?

如何创建一个存储库方法来使用最后 6 个字符查询上述 3 个测试记录,该方法使用我在上面创建的索引,以便生成此查询:

SELECT vin, year, make, model
FROM vehicle 
WHERE RIGHT(vin,6) = '123456';

当我使用 pgadmin 命令行执行上面的查询时,它工作正常。

最佳答案

JPQL 支持(自 JPA 2.1 IIRC 起)使用 function 调用任意数据库函数:

select v from Vehicle v
where function('RIGHT', v.vin, 6) = :endOfVin

关于java - 使用数据库函数的JPA查询使用特定索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115100/

相关文章:

active-directory - 具有 LDAP(Active Directory)的 Spring 数据返回将不会在任何写入操作中执行

java - @JsonView 未渲染 Spark 中部署的 Spring Boot 应用程序

java - 打印机驱动程序在java中的实现

java - 具有oneToMany关系的Spring boot rest api post方法

java - 为什么 JPA 实体类及其方法不能声明为 final?

java - 如何将单独 jar 中的 JPA 实体聚合到单个持久性单元中?

java - 更改或覆盖 Mongorepository.save(document) 的默认行为

java - 使用不同端口与 intern() 运行 2 个 Tomcat 服务器是否会锁定相同的 id?

java - 比较 File 和 PrintWriter 中的数字

spring - 如何在 Spring Data JPA 中使用带有分页的投影接口(interface)?