学习如何编写JPA查询。请告诉我是否可以更有效地编写下面的查询,可能在一个select语句中。可能是一个加入,但不知道如何去做。如何编写JPA查询
class Relationship {
@ManyToOne
public String relationshipType; //can be MANAGER, CUSTOMER etc
@ManyToOne
public Party partyFrom; // a person who has a relation
@ManyToOne
public Party partyTo; // a group a person relate to
}
查询:
String sql = "";
sql = "select rel.partyTo";
sql += " from Relationship rel";
sql += " where rel.partyFrom = :partyFrom";
sql += " and rel.relationshipType= :typeName";
Query query = Organization.em().createQuery(sql);
query.setParameter("partyFrom", mgr1);
query.setParameter("typeName", "MANAGER");
List<Party> orgList = query.getResultList();
String sql2 = "";
sql2 = "select rel.partyFrom";
sql2 += " from Relationship rel";
sql2 += " where rel.partyTo = :partyToList";
sql2 += " and rel.relationshipType = :typeName2";
Query query2 = Organization.em().createQuery(sql2);
query2.setParameter("partyToList", orgList);
query2.setParameter("typeName2", "CUSTOMER");
List<Party> personList2 = query2.getResultList();
无论是查询工作。查询1返回人员(mgr1)与MANAGER关系的组列表。查询2将所有他们是客户的人员返回到由查询1返回的组。实际上,我得到了他们所属的人员(客户)与Person(mgr1)具有关系MANAGER的同一组的列表。
是否有可能将它们组合成单个sql语句,因此可能只有一个数据库访问?
谢谢!!工作是完美的(没有ID - 编辑)..会接受的答案,迫不及待地想看到的内层查询的性能是否有人评论是否..这是它的最佳方式..再次感谢.. – bsr 2010-07-29 13:35:14
子查询将很快,因为它不是一个相关的查询 - 它只计算一次,就像您的原始代码一样。就在今天,我用WHERE IN替换了LEFT JOIN,并在SQL服务器上将查询的性能从18秒改为5秒。你不会说你正在使用哪个数据库,但通常情况下,当你只进行存在测试而不使用任何数据时,子查询可以超越联接。 – mdma 2010-07-29 13:42:04
谢谢..计划使用PostgreSQL或Oracle ..我使用休眠ORM,所以可能它可能与其他人兼容..你可以请详细说明存在测试vs不使用任何数据..每天学习新的东西: - )谢谢.. – bsr 2010-07-29 14:24:17