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構文にエラーがあります。'30 entitycity0_.DAYの近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください)

INTERVALとDAYがMysqLの機能であるとどのように休止状態と言うことができますか?出来ますか?

ありがとう。

4

2 に答える 2

0

どのMySQL方言を使用していますか?MySqlDialectまたは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 に答える
0

INTREVALおよびDAY(ここで使用される)は関数ではありません。Hibernateが「説得」されているかどうかはわかりませんが、次のものを置き換えてみることができます。

(now() - INTERVAL 30 DAY)

と:

DATE_SUB( NOW(), INTERVAL 30 DAY )
于 2012-04-19T08:16:47.560 に答える