1

私のプレーヤーエンティティでは、すべてのプレーヤーのスコアの合計に含める式を使用しようとしています。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;    
import org.hibernate.annotations.Formula;
import com.google.gwt.user.client.rpc.IsSerializable;

@Entity
public class Player implements IsSerializable {
    @Id 
    private String name;
    @Column(nullable = false) 
    private Integer score;
    @Formula(value = " SELECT sum(score) ") 
    private Integer totalScore = 0;
    [...]
}

ただし、プレーヤーをロードするときに構文エラーが発生します。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
  You have an error in your SQL syntax; check the manual that corresponds to 
  your MySQL server version for the right syntax to use near 
  'SELECT sum(this_.score)  as formula0_0_ from Player this_' at line 1

奇妙なことに、このクエリは完全に有効に見え、休止状態と同じデータベースで実行すると、期待どおりの結果が得られます。

SELECT sum(this_.score) as formula0_0_ from Player this_
1 row(s) returned

mysql 方言を使用するように休止状態を設定しました

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

jdbc が正しいクエリに対してエラーをスローするのはなぜですか?

4

1 に答える 1

1

そうみたいです

@Formula(value = " SELECT sum(score) ") 

する必要があります

@Formula(value = " sum(score) ") 

代わりは。MySQL に送信される SQL クエリが

SELECT SELECT sum(this_.score) as formula0_0_ from Player this_

これは明らかに無効です。

MySQL は、エラーが発生した時点からの SQL 文字列のみを表示します。あなたのケースでは、この時点から有効な SQL クエリがあるため、これは役に立ちません。

于 2013-03-29T13:13:38.113 に答える