3

我正在尝试在 Hibernate 中注册自定义方言。我找到了很多例子,我以为我有它 - 现在它告诉我该函数在我的数据库中不存在。具体来说,我正在尝试为 MySQL 5.6 创建 date_add() 方言。我正在使用休眠 3.6.7。

在 hibernate.cfg.xml 中:

<hibernate-configuration>
    <session-factory>
        <property name="dialect">com.myPackage.CustomMySQLDialect</property>    
</session-factory>
</hibernate-configuration>

在 com.myPackage.CustomMySQLDialect 中:

public class CustomMySQLDialect extends MySQL5InnoDBDialect {

     public CustomMySQLDialect() {
          super();
          registerFunction( "date_add_interval", new SQLFunctionTemplate( Hibernate.DATE, "date_add(?1, interval ?2 ?3)" ) );
     }

}

当我在 DAOImpl 类中调用它时:

List<User> userList = null;
            Query confirmationUser = session.getCurrentSession().createQuery("from InitUser where enabled = 0 and date_add_interval(created_date, 1, day) < now() and end_date is null");

userList = confirmationUser.list();  // <-- this is where it dies

这是一个例外:

Hibernate: select inituser0_.init_user_id as init1_58_, inituser0_.confirmation_date as confirma2_58_, inituser0_.confirmation_sent_date as confirma3_58_, inituser0_.confirmation_token as confirma4_58_, inituser0_.created_date as created5_58_, inituser0_.current_sign_in_date as current6_58_, inituser0_.current_sign_in_ip as current7_58_, inituser0_.email as email58_, inituser0_.enabled as enabled58_, inituser0_.end_date as end10_58_, inituser0_.failed_sign_in_count as failed11_58_, inituser0_.last_sign_in_date as last12_58_, inituser0_.last_sign_in_ip as last13_58_, inituser0_.password as password58_, inituser0_.remember_created_date as remember15_58_, inituser0_.reset_password_confirmation_date as reset16_58_, inituser0_.reset_password_sent_date as reset17_58_, inituser0_.reset_password_token as reset18_58_, inituser0_.sign_in_count as sign19_58_, inituser0_.updated_by as updated20_58_, inituser0_.updated_date as updated21_58_, inituser0_.username as username58_ from InitUser inituser0_ where inituser0_.end_date is null
Hibernate: select inituser0_.init_user_id as init1_58_, inituser0_.confirmation_date as confirma2_58_, inituser0_.confirmation_sent_date as confirma3_58_, inituser0_.confirmation_token as confirma4_58_, inituser0_.created_date as created5_58_, inituser0_.current_sign_in_date as current6_58_, inituser0_.current_sign_in_ip as current7_58_, inituser0_.email as email58_, inituser0_.enabled as enabled58_, inituser0_.end_date as end10_58_, inituser0_.failed_sign_in_count as failed11_58_, inituser0_.last_sign_in_date as last12_58_, inituser0_.last_sign_in_ip as last13_58_, inituser0_.password as password58_, inituser0_.remember_created_date as remember15_58_, inituser0_.reset_password_confirmation_date as reset16_58_, inituser0_.reset_password_sent_date as reset17_58_, inituser0_.reset_password_token as reset18_58_, inituser0_.sign_in_count as sign19_58_, inituser0_.updated_by as updated20_58_, inituser0_.updated_date as updated21_58_, inituser0_.username as username58_ from InitUser inituser0_ where inituser0_.enabled=0 and date_add_interval(inituser0_.created_date, 1, day)<now() and (inituser0_.end_date is null)

WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 1305, SQLState: 42000
ERROR: org.hibernate.util.JDBCExceptionReporter - FUNCTION myDBName.date_add_interval does not exist
ERROR: com.somePackage.InitUserDAOImpl - could not execute query

它超越了查询的创建,然后尝试执行它,然后抱怨它找不到该函数。它在数据库名称的前缀中指定我的数据库的名称。

这是没有正确注册吗?我应该将 myDBName 指定为要注册的数据库吗?如果是这样,怎么做?

还是我走远了?

4

1 回答 1

0

最后,我使用 Joda 进行时间计算,并以预先计算好的形式发送。一方面,我不得不重新编写一堆代码来支持这一点。另一方面,我一直在使用它,感觉非常快乐。

http://www.joda.org/joda-time/

于 2014-11-21T13:20:46.683 回答