2

ユーザー名でユーザーを取得できるこの単純なメソッドを呼び出すと、この問題が発生します。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    @Constraints.Required
    public String username;


    @Constraints.Required
    public String password;


    public boolean isAdmin;

    public static User findById(Long id) {
        return JPA.em().find(User.class, id);
    }

    public void update(Long id) {
        this.id = id;
        JPA.em().merge(this);
    }

    public void save() {
        JPA.em().persist(this);
    }

    public void delete() {
        JPA.em().remove(this);
    }


    public static User findByUsername(String username) {
        Query query = JPA.em().createQuery("select u from User u where username = :username", User.class);
        query.setParameter("username", username);
        return (User) query.getSingleResult();
    }

}

クエリの作成時にエラーが発生し、次のようになります。

[IllegalArgumentException: Type specified for TypedQuery [models.User] is incompatible with query return type [interface java.util.Map]]

私は Hibernate と PlayFramework を使用していますが、これを修正する方法を知っている人はいますか?

4

2 に答える 2

2

問題は Play の開発モードにあります。startコマンドではなくコマンドでコードを使用すると、コードが機能することがわかりますrun

これは、クラスのリロードと関係があると思います。使用しているクラス (のバージョン) は、Hibernate の開始時に存在しません。Hibernate がクエリによって返された型を見つけられない場合、にフォールバックしMapます。次にそれをクラス引数と比較すると、何か問題があることがわかり、文句を言います。

型付きクエリを使用しない以外に、この問題を回避する方法は見つかりませんでした。これはまったく面白くありません:-(

于 2013-06-20T10:32:04.527 に答える
-2

あなたの選択はナンセンスです。できませんselect u from User u。次のような1つ以上の列を指定する必要があります

select u.password from User u where u.username = :username

 -単一の文字列を返すものはどれですか-

または、完全なレコードを取得します

from User u where u.username = :username

User のインスタンスを返します (selectここではキーワードは必要ありません)。

于 2013-04-26T09:23:38.140 に答える