选择实体中包含的列表的子集

时间:2015-09-20 21:10:44

标签: java jpa criteria jpql

假设我想要获取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;

但是我想在一个查询中一次完成所有操作。我可以用标准来做吗?我没有花时间去学习它但是如果可能的话我会的。

2 个答案:

答案 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和另一个。