Сложный заказ в JPQL - PullRequest
       6

Сложный заказ в JPQL

1 голос
/ 10 ноября 2010

Позвольте мне начать с того, что я не парень из БД.Это просто запутало меня до смерти, но, к сожалению, я был вынужден сделать это на работе, поэтому я немного застрял: -)

Я пытаюсь получить сложный заказ на работу в JPQL, иМне совсем не повезло.

Мой текущий запрос выглядит так:

select distinct msg from CSMessage msg, Error err where msg = err.msg order by err.task.src

Что я пытаюсь сделать, это получить все сообщения с соответствующими ошибкамизатем отсортируйте все целиком, используя исходный документ (err.task.src), чтобы все сообщения с ошибками с одним и тем же источником отображались вместе.

Нет необходимости говорить, что это вообще не работает.Я получаю исключение, которое говорит;«Элемент ORDER BY должен быть в списке SELECT DISTINCT»

Я просмотрел документы и другие источники и, похоже, там нет ничего, что могло бы мне помочь.

Кто-нибудь может указать мне правильное направление?

Спасибо

Редактировать 1:

Сущности выглядят так:

CSMessage

public class CSMessage extends BaseModel implements Serializable
{

    private static final long serialVersionUID = 1L;

        .
        .
        .
        Other fields not shown for brevity
        .
        .
        .
    @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "TASK_ID")
    private Task task;
}

Ошибка:

public class Error
{

    private static final long serialVersionUID = 1L;

    @Column(name = "ERR_STRING", length = 255)
    private String errString;

    @Column(name = "ERR_TYPE")
    private Integer errType;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "MSG_ID")
    private CSMessage msg;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "SRC_ID")
    private CommonSource src;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "TASK_ID")
    private Task task;
}

Задание

public class Task
{

    private static final long serialVersionUID = 1L;

    @Column(name = "CORRELATION_UUID", length = 36)
    private String correlationId;

    @Column(name = "CURRENT_NODE", length = 255)
    private String currentNodeName = "empty";

    @Column(name = "PROCESS_NAME", length = 255)
    private String processName = "empty";

    @Column(name = "SITE_ID", length = 10)
    private String siteId = "1";

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SRC_ID")
    private CommonSource src;
}

Ответы [ 2 ]

0 голосов
/ 19 января 2018

Если ваша единственная проблема - упорядочить список результатов, то один из способов сделать это - добавить @OrderBy в глобальные поля (по умолчанию используется ASC, который можно не указывать):

@OrderBy ("YOUR_COLUMN_NAME")

Если вы хотите в порядке убывания, синтаксис будет:

@ OrderBy ("YOUR_COLUMN_NAME DESC")

Например:

@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "TASK_ID")
@OrderBy("TASK_ID") // <-------- ASC
private Task task;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SRC_ID")
@OrderBy("SRC_ID DESC") // <-------- DESC
private CommonSource src;
0 голосов
/ 14 февраля 2013

У вас есть несколько вариантов:

выберите отдельное сообщение из сообщения CSMessage, ошибка err, где msg = err.msg, порядок по err.task.src

  • Добавьте err.task.src для выбора предложения (выберите msg, err.task.src) и измените тип возврата в вашем методе

  • Порядок в памяти вместо bd с использованием интерфейса Comparable (реализует Comparable и использует Collections.sort)

  • Также вы можете использовать критерии Query или nativeQuery

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...