我有一个包含某些字段的实体
@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。
答案 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;
}
我认为与两个单独的查询相比,一个捕获所有查询的性能差异很小。根据执行计划,甚至可能会发生此解决方案更快,因为您需要仅在第一个查询失败时触发第二个查询。