【问题标题】:Order By Oracle Function In JPA Criteria Builder在 JPA Criteria Builder 中按 Oracle 函数排序
【发布时间】:2015-05-11 17:34:26
【问题描述】:

我有以下 SQL

SELECT ID,LASTTIMEEXECUTEDDATE as d FROM STATISTICSDATE ORDER BY LASTTIMEEXECUTEDDATE

使用 CriteriaBuilder 可以正常工作:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<StatisticsDate> cq = cb.createQuery(StatisticsDate.class);
    Root<StatisticsDate> rootEntry = cq.from(StatisticsDate.class);        
    CriteriaQuery<StatisticsDate> all = cq.select(rootEntry).orderBy(cb.desc(
    rootEntry.get("lastTimeExecutedDate")));
    TypedQuery<StatisticsDate> allQuery = em.createQuery(all);

但是现在我需要使用这个来获得更准确的结果:

SELECT ID,LASTTIMEEXECUTEDDATE as d FROM STATISTICSDATE ORDER BY 
to_timestamp(LASTTIMEEXECUTEDDATE, 'DD.MM.YYYY:HH24:MI:SS')  desc;

我可以通过本机 sql 执行此操作,但我想知道是否可以通过 CriteriaBuilder 使用它。

困扰我的是to_timestamp(LASTTIMEEXECUTEDDATE, 'DD.MM.YYYY:HH24:MI:SS')

谢谢

【问题讨论】:

  • lastTimeExecutedDate是哪种类型?
  • 不幸的是字符串

标签: java hibernate jakarta-ee jpa eclipselink


【解决方案1】:

试试这样:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<StatisticsDate> cq = cb.createQuery(StatisticsDate.class);
Root<StatisticsDate> rootEntry = cq.from(StatisticsDate.class);
CriteriaQuery<StatisticsDate> all = cq.select(rootEntry).orderBy(cb.desc(
    cb.function(
        "to_timestamp", Timestamp.class,
        rootEntry.get("lastTimeExecutedDate"),
        cb.literal("DD.MM.YYYY:HH24:MI:SS")
    )
));

TypedQuery<StatisticsDate> allQuery = em.createQuery(all);

【讨论】:

  • 我是通过本机查询完成的,运行您的解决方案给了我一个奇怪的错误:Caused by: java.lang.IllegalArgumentException: The attribute [LASTTIMEEXECUTEDDA TE] from the managed type [EntityTypeImpl@208718431:StatisticsDate [ javaType: c lass sep.tools.StatisticsDate 描述符:RelationalDescriptor(sep.tools.Statist icsDate --> [DatabaseTable(STATISTICSDATE)]), mappings: 2]] 不存在。在 org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.getAtt ribute(ManagedTypeImpl.java:147) 在 org.eclipse.persistence.internal.jpa.querydef.FromImpl.get(FromImpl.j ava:312)跨度>
  • 您需要将列名 LASTEXECUTEDDATE 替换为关联的属性名。检查更新的条件查询。
  • cb.function() 方法对我来说似乎不适用于自定义函数。它适用于标准功能。我的自定义函数在运行时被“最少”函数替换..
猜你喜欢
  • 2017-09-26
  • 2017-06-01
  • 2021-06-29
  • 2017-05-02
  • 1970-01-01
  • 2013-08-25
  • 2017-07-20
  • 2015-01-14
相关资源
最近更新 更多