2015-07-23 2 views
0

У меня есть объект с определенными полямиJPA 2.0, запись запроса с несколькими условными

@Entity 
public MyEntity { 

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

    public UUID uuid; 

    public String value; 

    ..... 

} 

Теперь я хотел бы создать запрос, который возвращает 1, если есть по крайней мере, X объекты в базе данных с таким же UUID, или возвращает 2, если есть хотя бы Y объектов с одинаковым uuid и имеют одинаковое значение. Я не уверен, описал ли я это хорошо. Если я хотел бы сделать это в 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, CriteriaQuery (что-то еще) для достижения этого? Я использую JPA 2.0, и Hibernate 4.

+0

Я думаю, что лучше всего использовать собственный запрос. – DuncanKinnear

ответ

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; 
} 

Я думаю, что разница в производительности одного улова все это запрос по сравнению с два отдельных запроса минимальны. В зависимости от плана выполнения может даже случиться, что это решение выполняется быстрее, так как вам нужно только запустить второй запрос, если первый сбой.