Будьте в спящем режиме Запрос HQL: Как установить Набор как именованный параметр Запроса?

Оконные функции - отличный способ справиться с этим. Сложность использования оконной функции COUNT заключается в том, что она не позволяет выполнить COUNT(DISTINCT ...). Поэтому, если у пользователя есть 2 подзадачи, он вернет 2, когда я предполагаю, что вы хотите, чтобы он возвратил 1.

Однако, мы могли бы использовать оконные функции MIN и MAX, чтобы увидеть, есть ли только один пользователь для задачи.

MIN([user]) OVER (PARTITION BY task) получит «минимальное» пользовательское значение для задачи в наборе результатов. Аналогично, MAX получит «максимум». Если они одинаковы, это означает, что для этой задачи есть только один пользователь, даже если у одного и того же пользователя несколько подзадач.

SELECT
    task,
    subtask,
    [user],
    CASE
        WHEN MIN([user]) OVER (PARTITION BY task) = MAX([user]) OVER (PARTITION BY task)
        THEN 'Individual ' + [user]
        ELSE 'Team'
    END
FROM Tasks

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

SELECT
    A.task,
    A.subtask,
    A.[user],
    CASE
        WHEN B.user_count = 1
        THEN 'Individual ' + [user]
        ELSE 'Team'
    END
FROM Tasks A 
INNER JOIN 
    (
        SELECT 
            task,
            COUNT(DISTINCT [user]) user_count
        FROM #tmp
        GROUP BY
            task
    ) B 
ON      A.task = B.task

Так как вы планируете запустить это с довольно большой таблицей, возможно, будет полезно проверить оба решения на производительность.

65
задан Mat 1 November 2011 в 11:04
поделиться

2 ответа

Используйте Query.setParameterList(), Javadoc здесь .

существует четыре варианта для выбора от.

92
ответ дан Baztoune 24 November 2019 в 15:24
поделиться

Я не уверен в HQL, но в JPA Вы просто называете запрос setParameter с параметром и набором.

Query q = entityManager.createQuery("SELECT p FROM Peron p WHERE name IN (:names)");
q.setParameter("names", names);

, где names набор имен, Вы ищете

Collection<String> names = new ArrayList<String();
names.add("Joe");
names.add("Jane");
names.add("Bob");
31
ответ дан Steve Kuo 24 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: