Java JPA多个查询而不是一个查询

Java JPA多个查询而不是一个查询,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个实体: @Entity @Table(name = "ACCOUNT") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class MyCloudAccount implements Serializable { ... @OneToMany(mappedBy = "account", cascade = CascadeType.ALL, fetch = FetchType.EAGER)

我有两个实体:

@Entity
@Table(name = "ACCOUNT")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class MyCloudAccount implements Serializable {

    ...

    @OneToMany(mappedBy = "account", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<ServerInstance> servers = new HashSet<ServerInstance>();

    ...
}

@Entity
@Table(name = "SERVER_INSTANCE")
public class ServerInstance implements Serializable {

    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ACCOUNT_ID")
    private MyCloudAccount account;

    ...
}

这将为帐户生成一个查询,为服务器生成N个查询,而不是带有外部联接的查询。如何强制JPA以最佳方式进行查询?

我发现使用Java持久性查询语言更方便

你可以做:

@NamedQueries{
    @NamedQuery(name="myQuery" query="SELECT a FROM MyCloudAccount JOIN FETCH a.servers")
}
public class MyCloudAccount{
    ...
}
那你就可以了

TypedQuery<MyCloudAccount> query = em.createNamedQuery("MyCloudAccount.myQuery", MyCloudAccount.class);
List<MyCloudAccount> results = query.getResultList();
TypedQuery query=em.createNamedQuery(“MyCloudAccount.myQuery”,MyCloudAccount.class);
List results=query.getResultList();
编辑
实际上您已经在使用JPQL了。解决问题的关键是使用
JOIN-FECTH
命令。

是否
返回entityManager.createQuery(“FROM”+persistentClass.getName()+“e”).list()导致相同的行为?是的,相同的行为。实际上,OP使用的是JPQL,他们只是将本地的
sql
命名,而不是
JPQL
@BradCupit确实如此。我可能应该说他应该使用NamedQueries,但问题是我有一个通用的DAO类来处理诸如findAll()、findById等查询。我不想为所有实体(或命名查询)编写findAll()metod的单独版本@user1557654好的,然后只添加
JOIN FETCH e.servers
命令,它将获取您所需的内容JOIN FETCH可以工作,但对我来说很奇怪,其他实体不通过这种方式自动获取。
TypedQuery<MyCloudAccount> query = em.createNamedQuery("MyCloudAccount.myQuery", MyCloudAccount.class);
List<MyCloudAccount> results = query.getResultList();