当前位置: 首页 > 知识库问答 >
问题:

SpringData和Querydsl生成的查询不是最优的

松翔
2023-03-14

我有实体:

@Entity
@Table(name = "doc_documents")
public class Document {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "doc_document_titles",
        joinColumns =
        @JoinColumn(name = "document_id"))
    @Column(name = "title")
    private List<String> titles = new ArrayList<>();
….
)

和存储库接口:

public interface DocumentRepo
        extends JpaRepository <Document, Long>, 
                QueryDslPredicateExecutor<Document> {
}

执行查询时:

Predicate crit = qDoc.titles.any().eq("x");
docRepo.findAll(crit);
select
    document0_.id as id10_
from
    doc_documents document0_ 
where
    exists (
        select
            1 
        from
            doc_documents document1_ 
        inner join
            doc_titles title2_ 
                on document1_.id= title2_.document_id 
        where
            document1_.id=document0_.id 
            and locthesaur2_.title = ?
    )
select
    document0_.id as id10_
from
    doc_documents document0_ 
where
    exists (
        select
            1 
        from
            doc_titles title2_ 
        where
            title2_.document_id=document0_.id 
            and title2.title= ?
    )

共有1个答案

卜飞鸣
2023-03-14

在JPQL级别上,谓词在内部被翻译成如下所示

exists (select 1 
        from Document doc2 
        inner join doc2.titles as doc2_titles
        where doc2 = doc and doc2_titles = ?)

不能直接在from部分中使用标题,因为它不是一个实体。如果您想出更好的方法在JPQL中表达这一点,请告诉我。

如果OneToMany也有类似的问题,请创建一张票据。

 类似资料:
  • 我得到了以下数据结构 我正在寻找一个查询dsl谓词,它给我的所有出版物,其中任何Author.name包含某个字符串,例如“汉斯” 我试过了: 但是,如果有多个作者在名称中包含“Hans”,则这是抱怨。有没有像出版一样就像一个集合?

  • 我想使用QueryDSL库构建select count查询,如下所示: 中选择计数(1) 我创建了下一个代码: 由于结果selectStatement是Next: 能否请一些人建议如何重写上面的代码

  • 例如,JPA标准API可以在没有生成元模型的情况下使用。失去了类型安全性,但我可以在运行时仅使用反射来创建查询,而无需事先了解数据模型。我想以同样的方式使用Querydsl。我不关心类型安全问题,因为我不知道数据模型。 在我最近的项目中,我想使用Querydsl,主要是因为它构成了持久性之上的另一层。所以我希望可以在JPA、JDO、JDBC、Lucene、Hibernate Search、Mong

  • 我在使用与Spring Data JPA集成的QueryDSL时遇到了一个奇怪的行为: 我在Project和Person之间有ManyToOne关系。如果我通过所有者ID(外键)获取属于用户的所有项目,一切都按预期工作: 生成的查询: 但是,假设我们想通过一个不是外键的字段(例如所有者的姓名)获取属于一个人的所有项目: 在这些情况下,表Person被不必要地连接了两次(请注意person1_和pe

  • 我无法在eclipse中生成querydsl Q类。如果有人能提供帮助,我们将不胜感激。下面是我尝试过的方法和pom中的代码片段。xml文件 我复制了建议的插件设置位于这里: https://github.com/querydsl/apt-maven-plugin/wiki/m2e-usage M2E,并将maven生成的源文件夹作为eclipse源文件夹 我已经确保安装了Maven并更改了我的e

  • 但是生成的SQL查询是 正如您所看到的,括号改变了,我相信两个查询中的条件并不相同。是虫子吗?使用hibernate和spring以及postgresql数据库。