Вставить атрибут в предложение JPQL SELECT - PullRequest
1 голос
/ 17 августа 2011

Давайте изобразим следующий вариант использования: у меня есть JPQL-запрос, который на лету создает объекты данных, используя ключевое слово new. В предложении SELECT я хотел бы добавить атрибут, который известен не базе данных, а слою, который ее запрашивает.

Это может выглядеть как

EntityManager em; // Got it from somewhere
boolean editable = false; // Value might change, e.g. depending on current date

Query q = em.createQuery("SELECT new foo.bar.MyDTO(o, :editable) FROM MyObject o")
            .setParameter("editable", editable);

List<MyDTO> results = (List<MyDTO>) q.getResultList();

Есть идеи, как этот вид вставки атрибутов или параметров в предложение SELECT может работать в JPQL? Возможны решения как JPA, так и JPA 2.0.

Редактировать: Производительность не играет ключевую роль, но ясность и чистота кода.

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

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

  • время, необходимое для выполнения запроса по базе данных (межпроцессный вызов, сетевое соединение)
  • время, необходимое для преобразования каждой строки в экземпляр MyObject с использованием отражения
  • время, необходимое для преобразования каждого экземпляра MyObject в MyDTO с использованием отражения

ваш цикл будет очень быстрым.

Если вы так обеспокоены производительностью, вам следует создавать экземпляры MyDTO вручную из возвращенных экземпляров MyObject, а не полагаться на Hibernate и рефлексию для этого.

Хранить в первую очередь просто, безопасно, читаемо и обслуживаемо. Затем, если у вас есть проблемы с производительностью, измерьте, чтобы определить, откуда она. Тогда и только тогда оптимизируйте.

2 голосов
/ 04 октября 2011

Это не будет работать без возможных расширений поставщика, потому что согласно спецификации:

4.6.4 Входные параметры
...
Входные параметры могут быть использованы только в Предложение WHERE или предложение HAVING запроса.

...