Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对实体图发出一个查询而不是多个查询_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 如何对实体图发出一个查询而不是多个查询

Java 如何对实体图发出一个查询而不是多个查询,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我有一个Spring数据存储库,在这里我可以获得一组客户的所有职位: public interface PositionRepository extends JpaRepository<Position, PositionKey> { @EntityGraph(value = "Position.all", type = EntityGraphType.LOAD) List<Position> findByAccountIn(Set&

我有一个Spring数据存储库,在这里我可以获得一组客户的所有职位:

public interface PositionRepository extends JpaRepository<Position, PositionKey> {

    @EntityGraph(value = "Position.all", type = EntityGraphType.LOAD)
    List<Position> findByAccountIn(Set<Account> accounts);
    
}
我总是将位置的完整实体图作为序列化JSON返回给客户机。所以,我总是需要所有属性和嵌套属性。位置实例最多为350个

尽管使用了
@NamedEntityGraph
,但我注意到仍在发出单独的查询。例如,我得到了每个唯一供应商的查询。通常需要约2-3秒才能从所有单个查询中获得结果

我如何告诉JPA发出一个包含多个联接的查询?我可以手动编写这个SQL(使用多个联接),它只需几毫秒就可以返回

更新

数据访问方式如下:

@RestController
@RequestMapping("/position")
@RequiredArgsConstructor
public class PositionController {

    private final PositionRepository positionRepo;
    
    @GetMapping
    public List<Position> getAllPositions(Set<Account> accounts) {
        return positionRepo.findByAccountIn(account);
    }
    
}
@RestController
@请求映射(“/position”)
@所需参数构造函数
公共类位置控制器{
私人最终头寸回购;
@GetMapping
公共列表getAllPositions(设置帐户){
返回位置repo.findByAccountIn(账户);
}
}

当返回位置列表时,它们将通过Jackson序列化。因此,实际访问数据的是Jackson。

如果您访问一个childEntity(loop.print,log),如果尚未获取,它将从DB获取数据。我认为您应该检查您的代码,以确保如何使用查询结果?如果您需要下游的子实体,最好尽早获取它(与父对象一起)@gtiwari333-感谢您的回复。是的,我需要下游的子实体,所以我尝试使用单个连接查询提前获取。我已经在另一篇文章中看到了你的答案。我尝试在
@EntityGraph
中使用attributePath而不是value元素,但hibernate仍会发出多个select语句,如OP中所述。您能否在访问数据的位置/方式共享代码?@gtiwari333-OP updated。
@RestController
@RequestMapping("/position")
@RequiredArgsConstructor
public class PositionController {

    private final PositionRepository positionRepo;
    
    @GetMapping
    public List<Position> getAllPositions(Set<Account> accounts) {
        return positionRepo.findByAccountIn(account);
    }
    
}