【问题标题】:JPQL & EclipseLink ConcatJPQL 和 EclipseLink 连接
【发布时间】:2012-11-17 16:11:17
【问题描述】:

当我连接 em.CreateQuery concat 中的字段时返回 NULL,因为我的字段之一可能有 NULL。我想在 Native MSSQL ISNULL(field,'somthing') 函数中检查 NULL。

MyQuery 是。

entManager.createQuery("SELECT NEW " + ThumbNail.class.getName() + "(p.id,p.thumbnail,p.thumbNailModifiedDate, CONCAT(p.firstName,' ',p.lastName,' ',p.middleName)) FROM Person p").setHint("eclipselink.refresh", "true").getResultList();   

这个也试过

entManager.createQuery("SELECT NEW " + ThumbNail.class.getName() + "(p.id,p.thumbnail,p.thumbNailModifiedDate, CONCAT(FUNC('ISNULL',p.firstName,''),' ',FUNC('ISNULL',p.lastName,''),' ',FUNC('ISNULL',p.middleName,'')) FROM Person p").setHint("eclipselink.refresh", "true").getResultList();

它没有用

【问题讨论】:

  • 如果您使用的是本机函数,则可以使用本机查询 -> entManager.createNativeQuery("Native SQL"); Eclipselink 和 JPA 通常可以很好地处理空值,所以我没有看到您的问题,但如果有充分的理由因为它的原生查询即使不可移植也很容易。
  • 感谢您的回复。但是我不能用本机查询来做到这一点,因为 p.thumbnail 是我的资源类。我已经用原生查询试过了。这里是。从日志中复制并更改为: entManager.createNativeQuery("SELECT t0.ID , t1.ID,t0.THUMB_NAIL_ID, t1.CREATION_DATE, t1.FROM_MODULE, t1.CHANGE_DATE, t1.RESOURCE_BYTE, t1.DIGEST, t1.RESOURCE_TYPE, t0.MODIFIED_DATE, ISNULL(t0.FIRST_NAME,'') + ' ' + ISNULL(t0.LAST_NAME,'') + ' ' + ISNULL(t0.MIDDLE_NAME,'') FROM INTERDIR_PERSON t0 LEFT OUTER JOIN INTERDIR_RESOURCES t1 ON (t1 .ID = t0.THUMB_NAIL_ID)",ThumbNail.class).getResultList();出现错误。
  • Func 已添加到 Eclipselink 2.1,因此在您下面提到的 EL 2.0.1 中不可用。对于 JPA 2.1 规范,它被 EclipseLink 2.4 中的 FUNCTION 取代:wiki.eclipse.org/EclipseLink/UserGuide/JPA/…
  • 迁移到更高版本的 EclipseLink 时会不会与其他查询发生冲突?

标签: jpa null eclipselink jpql concat


【解决方案1】:

JPQL 支持 coalesce 函数,该函数返回其第一个非空参数。所以你可以使用

CONCAT(coalesce(p.firstName, ''), 
       ' ', 
       coalesce(p.lastName, ''),
       ' ',
       coalesce(p.middleName, ''))

不过,我会把中间名放在中间,而不是放在最后。

【讨论】:

【解决方案2】:

已解决! 但不适用于 JPQL 函数。

我刚刚向我的 pojo 对象添加了新的构造函数,并用 JPQL 填充它,然后用 checkig for null 连接在那里。谢谢大家的回答。

【讨论】:

    【解决方案3】:

    修改jpa查询是一团糟……

    只需添加一个 notNull 方法:

    private String notNull(String input){ if (input != null) { return input.trim(); } return ""; }
    

    并将其放在实体类的每个(字符串)设置器上

    setFirstName(String name) { this.name = notNull(name) }
    

    所以你所有的“空值”都得到“”并且 jpa 工作

    但是:那么对于 db-nulls 你会得到 String="",所以要注意..

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2011-03-30
      • 2012-11-09
      • 2012-01-08
      • 2015-03-04
      • 2017-01-19
      • 2018-10-10
      • 2013-12-06
      • 2011-05-13
      相关资源
      最近更新 更多