【发布时间】:2012-07-01 09:52:42
【问题描述】:
我有 2 节课:
@Entity
@Table(name = "DRCOMMENTS" ,schema = "XXX")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Drcomments.findAll", query = "SELECT d FROM Drcomments d"),
public class Drcomments implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected DrcommentsPK drcommentsPK;
@Size(max = 50)
@Column(name = "SDESC")
private String commentSecondaryCodeDescription;
}
@Embeddable
public class DrcommentsPK implements Serializable {
@Column(name = "CODE")
private Short commentPrimaryCode;
@NotNull
@Column(name = "SCODE" , length=5)
private Short commentSecondaryCode;
}
我正在尝试使用动态 order by 和参数创建查询,例如: 当 DrcmetsPK.commentPrimaryCode 等于 1 时,我想选择所有 Drcmets 记录,并且 order by 将按 DrcmetsPK.commentSecondaryCode。这是我尝试过的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Drcomments> q = cb.createQuery(Drcomments.class);
Root<Drcomments> c = q.from(Drcomments.class);
q.select(c);
q.where(cb.equal(c.get("drcommentsPK").get("commentPrimaryCode"), 1));
Path<Drcomments> valuePath = c.get("drcommentsPK").get("commentSecondaryCode");
Order[] orders;
if(sord.equals("desc"))
{
orders = new Order[] {cb.desc(valuePath)};
}
else
{
orders = new Order[] {cb.asc(valuePath)};
}
q.orderBy(orders);
query = em.createQuery(q);
query.setFirstResult(start);
query.setMaxResults(start + limit);
results = query.getResultList();
问题是我得到的resultlist没有按照commentSecondaryCode desc order..
我做错了吗?如何才能做到这一点?如何创建将按可嵌入类中的字段排序的查询?
更新: 这是我得到的生成的sql:
SELECT * FROM
(SELECT * FROM
(SELECT EL_TEMP.*, ROWNUMBER() OVER() AS EL_ROWNM FROM
(SELECT CMSSDESC AS a1, CMSSCODE AS a4, CMSPCODE AS a5 FROM DRCOMMENTS
WHERE (CMSPCODE = 1) ORDER BY CMSSCODE DESC, CMSPCODE DESC)
AS EL_TEMP)
AS EL_TEMP2 WHERE EL_ROWNM <= 50)
AS EL_TEMP3 WHERE EL_ROWNM > 0
当我运行此代码时,它不会以 CMSSCODE desc 顺序返回记录..
(因为 order by 应该在外部选择中..)
我需要更改 query.setFirstResult() 和 query.setMaxResults() 中的内容吗?
我如何将它添加到条件查询的末尾,所以它将在最后一个选择中?
提前致谢。
【问题讨论】:
-
生成的SQL是什么样的?您可能会在那里找到热门歌曲。
-
@Rasmus Franke:如何查看生成的 SQL 字符串值?
-
它是您的 persistence.xml 中的供应商相关配置。例如,使用 hibernate 只需将
<property name="hibernate.show_sql">true</property>添加到您的持久性 xml。 -
@Rasmus Franke:我正在使用 eclipseLink,但我得到了生成的 SQL 字符串,并且我已经更新了我的问题......谢谢。
-
SQL有点奇怪,这么多子选择?如果您跳过第一个/最大结果部分,它是否有效?
标签: jpa jpa-2.0 criteria-api