【发布时间】:2011-10-09 21:44:11
【问题描述】:
我是一个已经建立项目的 Seam 新手,所以我使用的很多代码都是借用的,我并不总是完全确定事情是如何工作的。我的问题是我正在使用从 EntityQuery 扩展的查询对象来支持具有搜索和排序功能的列表页面,该功能需要在多对多关系和单独的多对一关系中进行搜索,这也必须用于种类。因为必须加入多对多关系以允许搜索功能,所以查询返回每个分配的重复记录。这没什么大不了的,因为我只是在 ejbql 中添加了“distinct”并且效果很好。但是,当我尝试按其他多对一关系排序时,Oracle 会抛出错误。当使用 distinct 关键字 http://ora-01791.ora-code.com/ 和 http://oraclequirks.blogspot.com/2009/04/ora-01791-not-selected-expression.html 时,Oracle 似乎不会接受不在 select 子句中的按列排序。
以下是实体中定义的关系:[Subject m:m JobFunction](显然是通过分配表 [Subject o:m Subject_JobFunction m:o JobFunction])和 [Subject m:o Type]。因为我需要通过 JobFunction 搜索 Subject,所以它加入了 ejbql,它要求 distinct 关键字仅将不同的 Subjects 返回到列表页面。当我尝试按 Type.name 排序(通过多对一关系)时,结果查询使 Oracle 生气并抛出“ORA-01791: not a SELECTed expression”错误。主题查询代码:
@Override
public String getEjbql() {
return "select subject from Subject subject left outer join subject.jobFunctions as jobFunction";
}
@Override
@SuppressWarnings("rawtypes")
public List<ValueExpression> getRestrictions() {
ValueExpression[] RESTRICTIONS = {
createValueExpression("lower(subject.name) like #{subjectQuery.prepRestriction(subjectQuery.subject.name)}"),
createValueExpression("subject.active = #{subjectQuery.active}"),
createValueExpression("subject.type.name = #{subjectQuery.typeName}"),
createValueExpression("jobFunction.name = #{subjectQuery.jobFunctionName}")
};
return Arrays.asList(RESTRICTIONS);
}
当我在用户通过前端按类型名称排序时设置查询顺序时:
"#{subjectQuery.order=='UPPER(subject.type.name) asc'}"
我收到 Oracle 错误。如果我从 ejbql 中取出不同的,排序工作正常,但我得到重复的主题记录。当我添加 distinct 关键字时,列表可以正常工作,没有重复记录,但排序会引发错误。有没有人对我如何重构 ejbql 以返回不带 distinct 关键字的不同记录以使排序愉快,或者如何进行排序而不使 Oracle 对查询中引用的排序列不在 select 子句中感到生气有任何建议?我已经阅读了几个地方,我的答案可能在 Hibernate Criteria API 中,但我不知道如何在扩展的 EntityQuery 类的上下文中利用它来完成我想要完成的任务。请帮忙!
【问题讨论】:
标签: oracle many-to-many seam