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。您要么必须指定一个或多个列,例如

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 回答