我有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结果()
中的某些内容吗?我如何将它添加到标准查询的末尾,以便它将在最后一个选择中?
谢谢,这是事先准备好的。
您的代码很好,并且符合标准。如果您确定它不起作用,那么在实现中一定有错误,或者在代码中没有显示的部分中有一些奇怪的东西。例如,检查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步