【问题标题】:JPA where in embeddable optimization (Hibernate, PostgreSQL)可嵌入优化中的 JPA(Hibernate、PostgreSQL)
【发布时间】:2016-01-03 22:31:59
【问题描述】:

我构建了一个简单的Query,它通过搜索带有可能性列表的@Embeddable 字段来返回结果列表。查询是:

select d from data d where embedField in :embedValues

它工作正常,但是使用 hibernate 和 PostgreSQL 发出到 sql server 的结果本机查询是这样的:

select * from data where 
    f1=$1 and f2=$2
  or
    f1=$3 and f2=$4
  or
    f1=$5 and f2=$6

我本来希望本机查询更有效,例如,

select * from data where (f1,f2) in (($1,$2),($3,$4),($5,$6))

我写namedQuery 是因为我想要更好的性能,但我不认为我会在执行查询时得到它。有没有更好的方法可以轻松获得更符合我预期的原生查询?

为了完整起见,我添加了一些说明性类。

@Embeddable class Embed {
  int f1;
  int f2;
  public Embed(int i, int j) {f1 = i; f2 = j;}
}

@Entity class Datum {
  @Embedded Embed embedField;
}

class Test {
  public static void main(String... args) {
    new Test().run();
  }
  public void run() {
    EntityManger em = ...
    List<Datum> data = em.createQuery("select d from Data d where embedField in $1")
      .setParameter(1, Arrays.asList(new Embed(1,2),new Embed(3,4),new Embed(5,6)))
      .getResultList();
  }
}

感谢您的帮助,不胜感激。

【问题讨论】:

    标签: sql hibernate postgresql jpa


    【解决方案1】:

    好吧,如上所述,我在 String 中编写了一个本机查询,它可以满足我的要求,但它绝对没有带来任何性能优势。我可以很好地想象,当 SQL 服务器将查询转换为执行计划时,无论如何它都是相同的结果,因此没有区别。所以,答案是,不,没有更好的方法来编写 JQPL 查询,就这样就可以了。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2023-04-03
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      相关资源
      最近更新 更多