1
我有一個實體可以說,它有一個類型地圖的元素集合的設備JPA標準阿比使用GROUP BY和HAVING子句
class Device{
BigDecimal id;
@ElementCollection
MAP<String, String> properties;
......
}
我需要編寫一個查詢檢索所有匹配的一組設備給定屬性。我使用標準API編寫了以下JPA查詢。
{
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Device> deviceQuery = criteriaBuilder.createQuery(Device.class);
Root<Device> device = deviceQuery.from(Device.class);
deviceQuery.select(device);
List<Predicate> criteria = new ArrayList<Predicate>();
if(!properties.isEmpty()){
MapJoin<Device, String, String > propertyJoin =device.joinMap("deviceProperties",JoinType.INNER);
Expression<BigDecimal> id = device.get(LocationConstants.ID);
for(Map.Entry<String,String> property : properties.entrySet()){
String key = property.getKey();
String value = property.getValue();
criteria.add(criteriaBuilder.and(criteriaBuilder.equal(propertyJoin.key(), key),
criteriaBuilder.equal(propertyJoin.value(), value)));
}
deviceQuery.groupBy(id);
deviceQuery.having(criteriaBuilder.equal(criteriaBuilder.count(id), properties.size()));
}
deviceQuery.where(criteriaBuilder.or(criteria.toArray(new Predicate[0])));
}
但這返回與匹配任何給予查詢輸入屬性的子集的重複的值的設備的列表。 查看形成的查詢,記錄的最終查詢中缺少groupby和having子句。任何想法爲什麼會發生這種情況,或者我在代碼中犯了什麼錯誤。謝謝這裏是最後的查詢
SELECT t1.ID, t1.DEVICE_TYPE, t1.CREATEDBY, t1.CREATEDON, t1.DESCRIPTION, t1.MODIFIEDBY, t1.MODIFIEDON, t1.NAME, t1.ID1, t1.ID2, t1.ID3, t1.STATUS, t1.INSTANCE, t1.NAMESPACE, t1.URL, t1.MAJOR, t1.MINOR, t1."UID"
FROM LOC_DEVICE_PROPERTY t0, LOC_DEVICE t1
WHERE ((((((t0.PROPERTY_KEY = ?) AND (t0.PROPERTY_VALUE = ?))
OR ((t0.PROPERTY_KEY = ?) AND (t0.PROPERTY_VALUE = ?)))
OR ((t0.PROPERTY_KEY = ?) AND (t0.PROPERTY_VALUE = ?)))
OR ((t0.PROPERTY_KEY = ?) AND (t0.PROPERTY_VALUE = ?)))
AND (t0.Device_ID = t1.ID))
ORDER BY t1.ID ASC
[[bind => [8 parameters bound]]]
如果缺少GROUP BY,HAVING,請提供JPA提供程序的錯誤。也許嘗試設置groupBy /之前的位置? –
即使移動where子句語句上面groupBy和 – user3019998
大概這是EclipseLink(基於生成的SQL,但你仍然沒有說過使用哪一個),所以看看升級到最新版本或者向他們報告一個錯誤。 –