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

最后用JPA CriteriaBuilder API实现空值

闻人望
2023-03-14

这里是Spring/HiberNate/MySQL/JPA。我有以下代码:

public void setOrdering(
    SearchRequest searchRequest,
    CriteriaQuery query,
    CriteriaBuilder builder,
    Root<? extends MyEntity> root) {

  String sortParam = "reportedOn";

  Expression expression = builder.selectCase()
    .when(builder.isNull(root.get(sortParam)), root.get(sortParam))
    .otherwise(root.get(sortParam));

  Order order = (searchRequest.isAscending())
    ? builder.asc(expression)
    : builder.desc(expression);

  query.orderBy(order);

}

基本上,我试图实现CriteriaBuilder/JPA等效的:

SELECT
  *
FROM
  mytable
WHERE
  <lots of predicates here>
ORDER BY reported_on IS NULL, reported_on <ASC/DESC>

我已经添加了WHERE谓词,我只是在努力处理查询。订购人(…)

在运行时,searchRequest。isAscending()为false,结果正常,包含null值的记录在结果末尾排序。

但是如果搜索请求。isAscending()为真,上次尝试的为空似乎根本不起作用。


共有2个答案

李锦
2023-03-14

它看起来不像是JPA的CriteriaBuilder支持NULLS LAST。我实际上是通过一个SQL的"hack"得到这个工作的:

String sortParam = "reportedOn";

Order order = (searchRequest.isAscending())
  ? builder.desc(builder.neg(root.get(sortParam)))
  : builder.desc(root.get(sortParam));

query.orderBy(order);

基本上ORDER BY-reported_onDESCORDER BYreported_onASC做同样的事情,但是它用NULLreported_on值对记录进行排序,一直到搜索结果的底部,这就是NULLS LAST应该做的事情。

莘聪
2023-03-14

您混淆了Spring和JPA API,此处查询来自JPA API,因此您需要使用以下内容进行排序:

CriteriaBuilder cb = ...
Root root = ...
query.orderBy(cb.asc(root.get("reportedOn")));
 类似资料:
  • 问题内容: 我有一个包含4列的表格:项目,年份,月份,金额。Amount的某些值是null,当发生这种情况时,我想用以前的非null的Amount值来填充这些值。当只有一个空值时,我可以使用LAG函数轻松地做到这一点,但是当连续有多个空值时,我不确定如何处理它。以下是该表的外观示例,其中添加了要在查询中添加的内容的列: 我有两个想法,我似乎无法投入工作来实现自己想要的东西。首先,我要使用LAG,但

  • 问题内容: 我最近获得了最新版本的Hibernate,并且注意到我的UserTypes现在有警告,关于不赞成AbstractStandardBasicType的nullSafeGet(ResultSet,String)和nullSafeSet(PreparedStatement,T,int)方法,建议使用带有SessionImplementor参数的相应方法。问题在于,当您实现UserType时,

  • 我想为一个类似跳棋的游戏实现一个人工智能 我写了以下方法: -方法 这将返回所有按重量排序的有效移动的列表,其中重量是根据移动的类型和位置计算的 -方法 将移动应用于棋盘,如果有棋子被杀则返回1 -方法 以恢复板的先前状态。 这是一个零和游戏,所以人工智能应该最大化玩家颜色的棋子,最小化对手的棋子。 为此,最好的方法似乎是使用最小-最大和α-β修剪。这有以下伪码 但我还没有明白如何适应我的问题。有

  • 我正在编写一个Tomcat应用程序,它充当一些内部服务的代理。 我已经将Spring项目从基于XML和注释的混合配置切换到基于Java和注释的配置。 根身份验证筛选器的代码: 在我的控制器中,是正确的(不是null)。 我遵循了你所有的指示2。但现在我得到了一个例外:

  • 我有一个react登录页面,里面有所有的东西(丢失密码、验证电子邮件、重新发送密码等)。然而,我想知道登录后的“最佳实践”应该是什么。 我的反应组件在正确输入用户名/密码后检索“成功”。但是我应该使用反应路由器将我的用户引导到另一个位置(并“输入”一个新的反应应用程序从这里处理事情,或者你们会怎么做?我使用PHP与反应(axios)。我想到了创建一个会话并启动一个新的响应应用程序(在另一个位置)-

  • 本文向大家介绍Python 实现使用空值进行赋值 None,包括了Python 实现使用空值进行赋值 None的使用技巧和注意事项,需要的朋友参考一下 0.摘要 在Python中,尤其是数组当中,对于一些异常值往往需要进行特殊处理。为了防止异常值与正常数据混淆,影响最终计算结果,常用的方法是将异常值置零或者置空。置零的方法较为简单,本文主要介绍如果对python中的数据进行置空。 1.赋值为Non