gpt4 book ai didi

java - QueryDSL 不使用 Postgres 索引

转载 作者:行者123 更新时间:2023-11-29 12:04:43 25 4
gpt4 key购买 nike

我在 Spring 应用程序上使用 Hibernate 和 QueryDSL 以及 PostgreSQL,我的筛选列表面临一些性能问题。使用 StringPath 类,我调用 startsWithIgnoreCase、endsWithIgnoreCase 或 containsIgnoreCase。生成的查询似乎具有以下 where 子句:

WHERE lower(person.firstname) LIKE ? ESCAPE '!'

使用较低的查询没有利用 Postgres 索引。在开发数据库上,使用 ILIKE 关键字查询最多需要 1 秒而不是 10 毫秒。

有没有办法使用 Postgres 的 ILIKE 获得谓词,因为 Ops 似乎没有提供它?

谢谢

最佳答案

我遇到了完全相同的问题 - lower(column) 导致错误的 pg 统计计算和请求计划效率不高,ilike 解决了这个问题。我不明白 OP 答案的哪些部分与解决方案相关,因此重新发明了相同的方法,但更短一些。

  1. 使用my_ilike函数引入新方言及其实现:

    public class ExtendedPostgresDialect extends org.hibernate.dialect.PostgreSQL9Dialect {
    public ExtendedPostgresDialect() {
    super();
    registerFunction("my_ilike", new SQLFunctionTemplate(BooleanType.INSTANCE, "(?1 ilike ?2)"));
    }
    }
  2. 指定此方言供 Hibernate 使用(我使用 Java 配置):

    Properties props = new Properties();
    props.setProperty("hibernate.dialect", "com.example.ExtendedPostgresDialect");
    factory.setJpaProperties(props);
  3. 就是这样,现在您可以使用它了:

    BooleanTemplate.create("function('my_ilike', {0}, {%1%})", stringPath, value).isTrue();

关于java - QueryDSL 不使用 Postgres 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32583158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com