Spring Data + JPA:强制实现OneToOne关系的内部联接

时间:2018-02-21 12:26:20

标签: postgresql jpa spring-data inner-join querydsl

我有一个具有OneToOne关系的实体,它仅用于对结果进行排序:

@Entity
public class Document {

    @Id
    Long id;

    @OneToOne()
    SortProperty sortProp;

    ...

}

然后我有了存储库(使用QueryDSL谓词):

public interface DocumentRepository 
             implements PagingAndSortingRepository<Document, Long>,
                        QueryDslPredicateExecutor<Document> {

     @EntityGraph(value = "Document.forceJoins")
     Page<Document> findAll(Predicate queryDslPredicate, Pageable pageable); 

     ...
}

如上所述,我使用@EntityGraph来控制主查询中的连接关系。所有这些都很好,唯一的问题是性能 - @OneToOneleft outer join获取的,这意味着不使用DB索引:

    select * from
       document document0_ 
    left outer join
       sortproperty sortproper3_ 
        on document0_.documentid=sortproper3_.documentid 
     ... 

有没有办法如何使用inner join代替left outer join强制执行?

我尝试了几件事 - @OneToOne(optional = false)@org.hibernate.annotations.Fetch,但没有成功......从QueryDSL谓词生成的部分使用了属性的正确内部联接,但查询使用的主要部分总是left outer join。我也尝试使用这种方法的注释:

@Query("select doc from Document doc inner join doc.sortProperties props")

但我无法与分页和QueryDSL谓词一起正确使用它。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用@Query注释尝试此操作。

@Query("select doc from Document doc join doc.sortProp props")