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();