gpt4 book ai didi

java - 如何编写JPA查询

转载 作者:行者123 更新时间:2023-12-02 08:13:53 25 4
gpt4 key购买 nike

学习如何编写 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 返回的组中他们属于客户的所有人员。实际上,我得到了他们所属人员(客户)的列表,该人员与人员 (mgr1) 具有关系为 MANAGER。

是否可以将它们组合成单个 sql 语句,这样可能只有一个数据库访问?

最佳答案

您实际上将一个查询嵌套在另一个查询中,并使用“where in”子句指定外部查询应从内部查询中获取客户。

select rel2.partyFrom
from Relationship rel2
where rel2.relationshipType = :typeName2 /* customer */
and rel2.partyTo.id in
(select rel.partyTo.id
from Relationship rel
where rel.partyFrom = :partyFrom
and rel.relationshipType = :typeName)

您的调用代码像以前一样传递 typeNametypeName2partyFrom 参数。不需要 PartyTo 参数,因为数据来自子选择(内部查询)。

您可以使用自联接来实现相同的效果,其中的 where 子句可过滤左侧的经理和右侧的客户,但使用“in”子句在语义上更清晰。

编辑:我将 .id 添加到子选择中,我认为这是需要的。

关于java - 如何编写JPA查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3362804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com