JPA 2.0,使用多个条件写入查询

时间:2015-07-23 19:26:03

标签: java jpa hibernate-criteria

我有一个包含某些字段的实体

@Entity
public MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    public UUID uuid;

    public String value;

    .....

}

现在我想创建一个查询,如果数据库中至少有X个实体具有相同的uuid,则返回1;如果至少Y个实体具有相同的uuid并且具有相同的值,则返回2。我不确定我是否描述得很好。如果我想在带有集合的java中执行它,就像下面的代码一样:

int b = 0;
String Y = ..;
UUID X = ...;
List<MyEntity> list = getAllEntitiesWithSameUUID(X)
if (list.sze() == 50) return 1 
for (MyEntity e : list) {
    if (e.value.equalsIgnoreCase(Y)) {
        b++;
        if (b == 100) {
            return 2;
        }
    }
}

在我的情况下,我必须处理大量数据,我想将所有处理移动到数据库服务器,并且在我的应用程序中,只检索整数作为查询结果。

我可以使用JPA的Query,CriteriaQuery(其他)来实现这一目标吗? 我使用的是Jpa 2.0和Hibernate 4。

1 个答案:

答案 0 :(得分:0)

我会使用两个查询并在Java中结合使用:

String value = ..;
UUID uuid = ...;

Number uuidCount = entityManager.createQuery(
        "SELECT COUNT(e) FROM MyEntity e WHERE e.uuid = :uuid").setParameter(
        "uuid", uuid).getSingleResult();
if (uuidCount.longValue() == 50) {
    return 1;
}

Number uuidAndValueCount = entityManager.createQuery(
        "SELECT COUNT(e) FROM MyEntity e WHERE e.uuid = :uuid AND e.value = :value").setParameter(
        "uuid", uuid).setParameter("value", value).getSingleResult();
if (uuidAndValueCount.longValue() == 100) {
   return 2;
}

我认为与两个单独的查询相比,一个捕获所有查询的性能差异很小。根据执行计划,甚至可能会发生此解决方案更快,因为您需要仅在第一个查询失败时触发第二个查询。