通过查询@EmbeddedId的JPA条件api顺序

时间:2012-07-01 09:52:42

标签: jpa jpa-2.0 criteria-api

我有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;
}

我正在尝试使用动态订单和参数创建查询,例如: 我想在DrcommentsPK.commentPrimaryCode等于1时选择所有Drcomments记录,而order by将由DrcommentsPK.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();

问题是我得到的结果列表没有按照commentSecondaryCode desc顺序排序..

我做错了吗?如何才能做到这一点?如何创建一个将由emeddable类中的字段排序的查询?

更新 这是我得到的生成的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命令中的记录。 (因为订单应该在外部选择..) 我是否需要更改query.setFirstResult()query.setMaxResults()中的内容? 我如何在条件查询中将它添加到最后,所以它将在最后一个选择?

感谢提前。

1 个答案:

答案 0 :(得分:0)

您的代码很好,符合标准。如果您确定它不起作用,则必须存在实现中的错误或者未显示的代码部分中的一些奇怪内容。例如,检查sord的值是否为"desc"(区分大小写),否则您将使用升序。

我尝试使用Hibernate 3.6.8.Final和EclipseLink(2.3.2)。它们都按预期工作 - ORDER BY SCODE [ASC/DESC]是执行的SQL查询的一部分。