使用Hibernate和PlayFramework,TypedQuery结果不兼容

时间:2013-04-26 07:47:03

标签: hibernate jpa playframework-2.0

我在调用这个简单的方法时遇到了这个问题,这个方法允许我通过它的用户名来获取用户:

@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,有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

Play的开发模式存在问题。如果将代码与start命令一起使用而不是run命令,则会发现代码可以正常工作。

我认为这与类重新加载有关。启动Hibernate时,您正在使用的(版本)类不存在。当Hibernate找不到查询返回的类型时,它会回退到Map。然后,当它将它与你的类参数进行比较时,它会发现存在错误并抱怨。

我找不到解决这个问题的方法,除了不使用类型查询,这根本不好玩: - (

答案 1 :(得分:-2)

你的选择是无稽之谈。你做不到select u from User u。您必须指定一个或多个列,如

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

- 你会返回一个字符串 -

或者您获取完整记录

from User u where u.username = :username

返回User的实例(此处不需要select关键字)。