2015-10-02 101 views
1

我想在grails域对象上执行sql语句。在db(h2)上直接执行时工作正常。to_char函数抛出异常与休眠

Call.executeQuery "select to_char(date,'DD') from Call" 

通过冬眠我得到:

节点无数据类型:org.hibernate.hql.internal.ast.tree.MethodNode - [METHOD_CALL] MethodNode: '(' + - [METHOD_NAME] IdentNode:'to_char'{originalText = to_char} - [EXPR_LIST] SqlNode:'exprList' + - [DOT] DotNode:'call0_.date'{propertyName = date,dereferenceType = PRIMITIVE,getPropertyPath = date,path = {synthetic-alias} .date,tableAlias = call0_,className = com.olamagic.Call,classAlias = null} | + - [IDENT] IdentNode:'{synthetic-alias} '{originalText = {synthetic-alias}} | - [IDENT] IdentNode: '日期'{originalText =日期} - [QUOTED_STRING] LiteralNode: '' DD ''

回答

1

当您执行的SQL语句H2直接你执行H2的SQL。 GormEntity.executeQuery(String sql)方法执行HQL,而不是SQL。

HQL没有to_char()函数。因此,获得相同的结果是更多地参与:

select case when day(date) > 9 then cast(day(date) as text) else concat('0', day(date)) end from Call 

如果你不介意这一天作为一个整数,然后将查询简化为:

select day(date) from Call 
+0

要是我需要更复杂的格式,让我们说dd-mm-yyy。反正有强迫执行语句再次数据库而宁? – Macchiatow

+0

HQL具有日,月,年等功能,但不具有日期格式功能。您可以使用Hibernate会话执行SQL查询。就像这样:'Call.withSession {session - > def result = session.createSqlQuery('select ...')。list()}'你也可以使用HQL来返回date对象并在Groovy中格式化:'def dates = Call.executeQuery(“从呼叫中选择日期”)* .format('dd-mm-yyyy')'。 http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch11.html#ql-exp-functions –

+0

哦酷。我不知道与本机SQL技巧。谢谢。 – Macchiatow