Java 如何在多个联接表和条件上提高JPA查询性能和响应时间

Java 如何在多个联接表和条件上提高JPA查询性能和响应时间,java,sql,spring-boot,jpa,h2,Java,Sql,Spring Boot,Jpa,H2,我是一个非常新的java初学者,我正在尝试实现审查文档的可能性。属于某个组的用户可以审阅分配给该组审阅文档类型的特定类型的文档。用户不能查看自己的文档。当用户属于可以查看多种文档类型的多个组时,有时我会得到大约1500个满足查询条件的文档。我尝试了分页,但在首页仍然有一些可见的延迟。当我获取所有文档时,大约需要3000+毫秒。我不确定这是否很多。我的JPA查询如下 @Query("SELECT d FROM Document d WHERE d.id IN (SELECT DISTINC

我是一个非常新的java初学者,我正在尝试实现审查文档的可能性。属于某个组的用户可以审阅分配给该组审阅文档类型的特定类型的文档。用户不能查看自己的文档。当用户属于可以查看多种文档类型的多个组时,有时我会得到大约1500个满足查询条件的文档。我尝试了分页,但在首页仍然有一些可见的延迟。当我获取所有文档时,大约需要3000+毫秒。我不确定这是否很多。我的JPA查询如下

    @Query("SELECT d FROM Document d WHERE d.id IN (SELECT DISTINCT d.id FROM Document d" +
        " JOIN d.documentType dt" +
        " JOIN dt.reviewUserGroups rug" +
        " JOIN rug.users u WHERE u.username = :username" +
        " AND d.documentState = it.akademija.wizards.enums.DocumentState.SUBMITTED" +
        " AND u <> d.author" +
        " AND (lower(CONCAT(d.author.firstname, ' ', d.author.lastname)) like %:searchFor% " +
        " OR lower(d.title) like %:searchFor%" +
        " OR lower(d.description) like %:searchFor%" +
        " OR lower(d.id) like %:searchFor%" +
        " OR lower(dt.title) like %:searchFor%))")
    Page<Document> getDocumentsForReview(@Param(value = "username") String username,
                                     @Param(value = "searchFor") String searchFor,
                                     Pageable pageable);

请让我知道提高性能的最佳方法是什么,因为我觉得这种类型的搜索在查询中多次使用like并通过多个实体连接是不正确的。

使用全文搜索而不是like。为此创建全文索引,请参见

您必须使用索引,b树表示相等,全文表示喜欢。您能否共享数据库定义以分析您是否使用了正确的索引?请澄清您所说的数据库定义是什么意思。目前我还没有编制任何索引。Hibernate在启动时自动创建表。我没有在实体中放置任何索引信息,如果您可以共享一些文档或教程,了解如何根据提供的查询在具有多个联接的实体中正确索引字段,那就太好了。我没有使用实体管理器,只是使用了JPARepository实现。