2

我有代码:

@Id
@Column(name = "id")
@GeneratedValue
private int id;

@Formula(value = "(SELECT count(history.city_id) FROM history where history.ts > (now() - INTERVAL 30 DAY) and history.city_id = id)")
private int last30daysUpdates;

因此,hiberante 将此公式解析为:

 ...where
            history.ts > (
                now() - entitycity0_.INTERVAL 30 entitycity0_.DAY
            ) ...

错误是:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '30 entitycity0_.DAY 附近使用的正确语法)

我怎么能说 INTERVAL 和 DAY 是 Mysql 的函数?可能吗?

谢谢。

4

2 回答 2

0

INTREVALDAY(这里使用的)不是函数。不确定 Hibernate 是否被“说服”,但您可以尝试替换:

(now() - INTERVAL 30 DAY)

和:

DATE_SUB( NOW(), INTERVAL 30 DAY )
于 2012-04-19T08:16:47.560 回答
0

您使用哪种 MySQL 方言?如果 MySqlDialect oder MySql5Dialect 你可以使用如下:

SELECT count(history.city_id) FROM history where timediff(now(), history.ts) < '720' and history.city_id = id

或者定义新的休眠功能

public class ExtendedMySQL5Dialect extends MySQL5Dialect 
{
        public ExtendedMySQL5Dialect() 
        {
           super();
           registerFunction( "date_sub_interval", new SQLFunctionTemplate( Hibernate.DATE, "date_sub(?1, INTERVAL ?2 ?3)" ) );
           registerFunction( "date_add_interval", new SQLFunctionTemplate( Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)" ) );           
        }
}

询问:

History.ts < date_sub_interval(now(), 30, DAY)
于 2012-05-03T11:25:25.250 回答