当前位置: 首页 > 知识库问答 >
问题:

@EmbeddedId的JPA标准api查询顺序

蒋奇
2023-03-14

我有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和参数的查询,例如:我想在DrcommentsPK时选择所有Drcomments记录。commentPrimaryCode等于1,其顺序为DrcommentsPK。注释第二代码。这就是我尝试的:

        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顺序排序。。

我做错什么了吗?如何做到这一点?如何创建按eMedTable类中的字段排序的查询?

更新:这是我得到的生成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.setMax结果()中的某些内容吗?我如何将它添加到标准查询的末尾,以便它将在最后一个选择中?

谢谢,这是事先准备好的。

共有1个答案

戚育
2023-03-14

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

我用Hibernate3.6.8. last和Eclipse Link(2.3.2)试过了。在这两种情况下,它都如预期的那样工作-ORDER BY SCODE[ASC/DESC]是执行SQL查询的一部分。

 类似资料:
  • 我使用JPA criteria API从数据库中获取记录。我有一个实体记录,其字段dateTime可以为空。我会编码: 事实证明,dateTimeField为空的记录首先显示。我使用Postrgres数据库。我会回答这个问题,因为我找到了解决办法。这里有一个类似的帖子。JPA标准查询API和订单(按空)

  • 我被一个简单的问题困住了;如何在ed实体上调用。基本上,我正试图通过JPA标准实现以下目标: 我有以下几点: 如何通过d.name,c.name使用来实现

  • 我的问题是空值必须是最后一个order by语句。下面是我的代码截图。我使用javax持久性标准生成器。我的问题很复杂。 如何通过criteria builder以零价格完成订单?

  • 我有一个带有嵌入Id的类。当我尝试使用Jpa存储库进行搜索时,它只返回一个空对象。问题似乎出在嵌入式Id中,因为我用一个没有这个Id的类进行了测试,结果很好。 当我针对数据库进行测试时,JPA在控制台中输出的查询工作正常。 并且没有输出错误。 编辑:数据库中有数据 EDIT2:添加了equals和hashcode。 编辑3:findAll方法有效。 实体 嵌入ID 存储库 服务 正如你所看到的,我

  • 主要内容:创建条件查询的步骤,标准API查询子句的方法标准(Criteria)API是构建实体及其持久状态查询的最常用方法之一。 它只是定义JPA查询的另一种方法。 Criteria API定义了一个独立于平台的条件查询,用Java编程语言编写。 它是在JPA 2.0中引入的。 这背后的主要目的是提供一种类型安全的方式来表达查询。 创建条件查询的步骤 要创建标准查询,请按照以下步骤操作: - 第1步: 通过在接口实例上调用方法创建接口的对象。 第2步