假设我想要获取id小于10的MyEntity
的所有行。此实体包含Another
实体的列表。我希望这个列表只能由listAnother
的子集获取。此子集仅包含Another
,其中包含的user
是特定的。{/ p>
基本上在SQL中它会是这样的:
SELECT * FROM myentity m
LEFT JOIN another a
ON m.idTable=a.my_entity
AND a.user = "test1"
WHERE m.idTable < 10;
然而,我没有管理将此查询转换为jpql。
我的实体是这样的:
@Entity
public class MyEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idTable;
@OneToMany(mappedBy = "myEntity")
private List<Another> listAnother;
}
@Entity
public class Another implements Serializable {
@Id
private int idAnother;
// bi-directional many-to-one association to Thethread
@ManyToOne(fetch = FetchType.LAZY)
private MyEntity myEntity;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
}
@Entity
public class User implements Serializable {
@Id
private String username;
}
在jpa中,我可以这样做:
SELECT m FROM MyEntity where m.idTable < 10;
然后对于我从这个列表中获得的每个实体,请调用:
SELECT a FROM Another Where a.user.username=:'test' AND a.myEntity=:entity;
但是我想在一个查询中一次完成所有操作。我可以用标准来做吗?我没有花时间去学习它但是如果可能的话我会的。
答案 0 :(得分:1)
JPQL和Critaria API在您可以用它们表达的方面是相同的。使用Criteria可以实现JPQL的可能性,反之亦然。
使用JPQL,您可以通过这种方式简单地将2个查询合并为一个:
SELECT m FROM MyEntity m LEFT JOIN m.listAnother a Where a.user.username=:test AND m.idTable < 10
如果关系是X-to-one,则可以使用点表示法(。)连接查询中的多个实体。如果你有X对多的关系,你需要使用JPQL JOIN,这不是很复杂。带(左)JOIN的示例:
{{1}}
结果当然不相等 - 在第一种情况下,您将获得另一个实体的列表,您可以通过a.myEntity获取MyEntity,在第二种情况下,您将获得MyEntity列表,其中至少有一个另一个实体与给定用户
答案 1 :(得分:0)
您需要扩展您应用的逻辑来检查用户名(a.user.username =:&#39; test&#39;),这是用于任何事物和用户之间的多对一关系的一个用户升级到myEntity,然后将其用于一对多关系 -
SELECT m FROM MyEntity where m.idTable < 10 and (m.listAnother.user.username=:'test')
加入条件&#34; m.listAnother.myEntity =:entity&#34;现在我们不需要,因为在我们的查询中,我们从特定的myEntity开始,然后向下移动到listAnother.user.username。
我没有表定义来自己尝试这个查询,确切的SQL可能需要一些调整 - 但从逻辑上讲,它应该像我上面展示的那样工作,也就是你加入另一个用户的方式,同样的你可以通过遍历子列表另一个来加入MyEntity和另一个。