【问题标题】:Common functions for oracle and mysql?oracle和mysql的常用函数?
【发布时间】:2019-12-17 03:52:56
【问题描述】:

在下面的查询中,我想按日期而不是时间分组,这就是我使用 TO_DATE 函数的原因

select TO_DATE(e.created_dt, 'dd-mm-yy'),sum(CURRENT_BAL) from sbill.act_resource_t e group by TO_DATE(e.created_dt, 'dd-mm-yy');

所以到目前为止,它与 oracle 配合得很好,但根据我们的业务需求,应用程序应该同时支持 oraclemysql,而无需编写两个不同的查询;

那么我们有什么解决方案可以同时适用于oraclemysql 吗?

注意:- 我正在使用hql

以下代码:

  Query query1 = entityManager.createQuery("select TO_DATE(e.createdDt, 'dd-mm-yy'),sum(CURRENT_BAL) from ActT e group by TO_DATE(e.createdDt, 'dd-mm-yy')");

    List<Object> result=query1.getResultList();

【问题讨论】:

  • 不,日期功能有很大不同。
  • @P.Salmon 这个链接stackoverflow.com/questions/1036657/…,与自定义方言有关...我有点困惑,这个解决方案对我有用吗?
  • 链接指的是 HQL,但您的问题标题是指 oracle 和 mysql。您实际使用的是什么。
  • 是的,我正在使用 hql,我正在编辑我的问题
  • 已编辑问题...抱歉给您带来不便...

标签: java mysql oracle hibernate


【解决方案1】:

由于数据库之间的功能不同,我们需要一个dynamic query。但是我们可以通过创建自定义转换方法来有效地做到这一点,该方法将根据当前数据库类型选择正确的实现。并且查询本身将保持常见(该解决方案使用FluentJPA 库):

public static final FormatModel DD_MM_YY = Format.dateModel(Format.DD, Format.MM, Format.YY);
public static boolean isOracle() {
    return false; //should return the actual value in runtime
}

@Local
// picks the right implementation
public static Function1<String, Date> AS_DATE() {
    if (isOracle())
        return s -> TO_DATE(s, DD_MM_YY); //oracle

    return s -> STR_TO_DATE(s, "%d-%m-%y"); // mysql
}

现在我们可以编写一个通用实现:

@Entity
@Table(name = "act_resource_t", schema = "sbill")
@Data
public static class ActResource {

    @Id
    private int id;

    private int currentBAL;
    private String createdDT;
}

// for the result
@Tuple
@Data
public static class BalanceByDate {
    private Date date;
    private int balance;
}

...

public BalanceByDate balanceByDate() {
    FluentQuery query = FluentJPA.SQL((ActResource e) -> {

        // with lambda we inject the right implementation
        Date createdDate = alias(AS_DATE().apply(e.getCreatedDT()), BalanceByDate::getDate);
        Integer balance = alias(SUM(e.getCurrentBAL()), BalanceByDate::getBalance);

        SELECT(createdDate, balance);
        FROM(e);
        GROUP(BY(createdDate));
    });

    return query.createQuery(em, BalanceByDate.class).getSingleResult();
}

这是 MySQL 生成的 SQL:

SELECT STR_TO_DATE(t0.created_dt, '%d-%m-%y') AS date, SUM(t0.current_bal) AS balance 
FROM sbill.act_resource_t t0 
GROUP BY  STR_TO_DATE(t0.created_dt, '%d-%m-%y')

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2019-12-16
    • 2013-02-13
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多