2

私は2つのエンティティを持っています:

@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;

    ...
}

このコードですべてのアカウントを取得しています:

StringBuilder sql = new StringBuilder();
sql.append("SELECT e FROM ");
sql.append(persistentClass.getName());
sql.append(" e");
return entityManager.createQuery(sql.toString()).getResultList();

これにより、外部結合を使用するクエリではなく、アカウントに対して 1 つのクエリが生成され、サーバーに対して N 個のクエリが生成されます。JPAに最適な方法でクエリを作成させる方法は?

4

1 に答える 1

2

Java Persistence Query Language を使用する方が便利だと思います

できるよ:

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

編集 あなたは実際にすでにJPQLを使用しています。問題の重要な点は、JOIN FECTHコマンドを使用することです。

于 2013-04-30T14:14:03.353 に答える