我有一个具有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
来控制主查询中的连接关系。所有这些都很好,唯一的问题是性能 - @OneToOne
是left 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谓词一起正确使用它。
有什么想法吗?
答案 0 :(得分:0)
使用@Query
注释尝试此操作。
@Query("select doc from Document doc join doc.sortProp props")