JPQL中的复杂订单

时间:2010-11-10 19:04:36

标签: jpa jpql

首先让我说我不是数据库人。这个东西让我感到困惑,但不幸的是我在工作中遇到了这个问题,所以我有点卡住: - )

我试图通过使用JPQL来获得复杂的订单,而我根本没有运气。

我当前的查询如下所示:

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

我想要完成的是获取所有msgs的相关错误,然后使用源文档(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 :(得分:0)

您有几种选择:

从CSMessage msg中选择不同的msg,错误错误,其中msg = err.msg命令err.task.src

  • 将err.task.src添加到select子句(选择msg,err.task.src)并更改方法中的返回类型

  • 使用interface Comparable(实现Comparable并使用Collections.sort)在内存中而不是bd中进行排序

  • 您也可以使用criteriaQuery或nativeQuery

答案 1 :(得分:0)

如果您唯一的问题是订购结果列表,那么一种方法是在全局字段上添加@OrderBy(默认顺序是ASC,可以省略):

  

@OrderBy(" YOUR_COLUMN_NAME&#34)

如果您想降序,语法将为:

  

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