JPA查询使用数据库函数使用特定索引
JPA query using a database function to use a specific index
我有一辆名为 table 的车辆,其中有一列名为 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
我有一辆名为 table 的车辆,其中有一列名为 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