JPQL отличается строковой функцией - PullRequest
1 голос
/ 21 сентября 2011

У меня есть JPQL, подобный этому:

select distinct d 
from Department d
left join fetch d.employees

Когда я хочу получить одно из ленивых свойств моего объекта Department, значение не работает больше .

select distinct d, substring(d.htmlDescription, 1,400)
from Department d
left join fetch d.employees

Запрос возвращает столько Департамента, сколько в нем сотрудников.

Значение substring(d.htmlDescription) важно, поскольку свойство определено как CLOB (тип TEXT в postgresql):

@Column(columnDefinition = "TEXT")
@Basic(fetch = FetchType.LAZY)
String htmlBody;

Функция подстроки переведена в sql, что ограничивает объем данных, передаваемых между базой данных и веб-сервером.

В качестве обходного пути я попытался разбить запрос на две части:

select d, substring(d.htmlDescription, 1,400)
from Department d where d in (
    select distinct d1
    from Department d1  left join fetch d1.employees
)

Это не работает, потому что JOIN FETCH нельзя использовать в предложении FROM подзапроса.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Наконец-то я нашел решение моей проблемы:

  1. изменение моего отображения
  2. обрезка запроса в 2 звонка.

Поле htmlBody теперь находится в другом объекте. Таким образом, сущность департамента легче.

class Department{
...
@OneToOne (fetch = FetchType.LAZY, 
    cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
Content content = new Content();
...
}


class Content{
...
@Column(columnDefinition = "TEXT")
@Basic(fetch = FetchType.LAZY)
String htmlBody;
...
}

Затем я могу использовать следующие запросы:

    List<Department> deps = em.get().createQuery(
            "select distinct d " +
                    "from Department d " +
                    "order by d.id desc ", Department.class)
            .setFirstResult(first)
            .setMaxResults(count)
            .getResultList();

    List<Object[]> tuple = em.get().createQuery(
            "select d, substring(d.content.htmlBody, 1,400)" +
                    "from Department d " +
                    "left join fetch d.employees" +
                    "where d in (:deps) order by d.id desc")
            .setParameter("deps", deps)
            .getResultList();

    ... //Filter the duplicates due to the fetching

Таким образом, у меня 2 запроса sql. Выборка сотрудников производится во втором запросе, который происходит на небольшом количестве данных. Подстрока реализована в SQL. Отлично!

0 голосов
/ 21 сентября 2011

Поскольку я не могу комментировать, я хотел бы отметить несколько вещей, которые мне кажутся сомнительными.

  1. Что за объект возвращается с distinct d, substring(d.htmlDescription, 1,400)? Не могли бы вы получить эту строку с помощью отдельного запроса или получить эту подстановку, используя Java?
  2. Я бы поверил, что этот запрос можно переписать в один без оператора соединения left.
  3. Может быть, вы могли бы переписать запрос, чтобы сначала поставить оператор подстроки, а затем отдельный d?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...