【问题标题】:JPA query using a database function to use a specific indexJPA 查询使用数据库函数以使用特定索引
【发布时间】:2015-06-29 11:57:56
【问题描述】:

我有一个名为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 命令行执行上面的查询时,它可以正常工作。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 优秀。这对我有用。我能够使用 EXPLAIN 来确认它正在使用该查询的相关索引。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多