【问题标题】:JPA criteria api order by query for @EmbeddedId通过查询@EmbeddedId 的 JPA 标准 api 顺序
【发布时间】: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 只需将 &lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt; 添加到您的持久性 xml。
  • @Rasmus Franke:我正在使用 eclipseLink,但我得到了生成的 SQL 字符串,并且我已经更新了我的问题......谢谢。
  • SQL有点奇怪,这么多子选择?如果您跳过第一个/最大结果部分,它是否有效?

标签: jpa jpa-2.0 criteria-api


【解决方案1】:

您的代码很好并且符合标准。如果您确定它不起作用,那么在未显示的那些代码部分中一定存在实现错误或一些奇怪的东西。例如,检查sord 的值是否与"desc" 完全一致(区分大小写),否则您将使用升序。

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

【讨论】:

  • 我检查了 sord 值,没关系。但我已经用生成的 sql 字符串更新了我的问题。谢谢。
  • 查询似乎是正确的。您能举例说明实际结果和预期结果吗?
  • 我发现为了对结果进行排序,我需要将 order by filed_name desc 添加到 over() 中。我可以用我当前的 CriteriaQuery 做到这一点吗?如何将其添加到查询中?再次感谢。
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2012-09-25
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多