【问题标题】:Parameter value [2] did not match expected type [com.cityBike.app.model.User参数值 [2] 与预期类型不匹配 [com.cityBike.app.model.User
【发布时间】:2016-04-22 15:13:39
【问题描述】:

我收到错误

java.lang.IllegalArgumentException:参数值 [2] 与预期类型不匹配 [com.cityBike.app.model.User (n/a)] 在 org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:885) 在 org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:80) 在 org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:248) 在 org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:631) 在 org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:180) 在 org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49) 在 com.cityBike.app.service.RentService.getAllByUser(RentService.java:22)

下面是我的代码 sn-p,我该如何解决这个问题?

文件 Rent.java

@Entity
@Table(name="Rent")
public class Rent implements Serializable {

    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)  
    @Column(name = "id")  
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "start_id")
    private Station start_id;

    @ManyToOne
    @JoinColumn(name = "meta_id")
    private Station meta_id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user_id; 
    ... 

文件用户.java

@Entity  
@Table(name="Users")
public class User implements Serializable {

    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)  
    @Column(name = "id")  
    private Integer id;

    @Column(name = "login")
    private String login;
...

文件 RentService.java

@Service
public class RentService {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public List<Rent> getAllByUser(int user_id){
            System.out.println(user_id);
            List<Rent> result = em.createQuery("from Rent a where a.user_id = :user_id", Rent.class).setParameter("user_id", user_id).getResultList();
            System.out.println(result);
        return result;
    }
}

当显示在控制台上时,我应该添加“user_id”是正确的,因为它具有这样的数值。 2 或 3。 请指导和帮助。

【问题讨论】:

  • JPQL 应该开始 "SELECT a"

标签: java hibernate jpa createquery


【解决方案1】:

Rent.user_id 的类型是用户,因此当您将 int 传递给查询时

from Rent a where a.user_id = :user_id

您将Userint 进行比较。

相反,你需要写

from Rent a where a.user_id.id = :user_id

我建议将Rent.user_id 重命名为Rent.user 以避免此类错误。

【讨论】:

  • 非常感谢帮助。我还有一个额外的问题,所以在“user_id”显示后,我有很多这样的 2。现在如何轻松地将其打开全名,例如。约翰?
  • @phoenix37 给定用户 ID,您可以通过 User user = em.find(User.class,user_Id) 查询用户对象,然后访问其名称。
  • 我遇到了同样的问题,您的回答解决了。另外,如果您可以在最后一行添加更清晰的内容“我建议将 Rent.user_id 重命名为 Rent.user 以避免这种错误”,我无法弄清楚如何以及到底要更改什么。
【解决方案2】:

你可以使用这个查询:-

Rent 类中的 user_id 不是 int,它是 User 类型的对象,因此您必须使用它的 id 获取 User 对象

List<Rent> result = em.createQuery("from Rent a where a.user_id = :user_id", Rent.class).setParameter("user_id", em.getReference(User.class, user_id)).getResultList();

或者你可以写:-

List<Rent> result = em.createQuery("from Rent a where a.user_id.id = :user_id",Rent.class).setParameter("user_id", user_id).getResultList();

【讨论】:

  • 也感谢您的帮助:)
猜你喜欢
  • 2021-08-05
  • 2016-07-13
  • 1970-01-01
  • 2018-09-02
  • 2020-11-29
  • 2015-12-13
  • 2016-09-18
  • 2014-04-06
  • 2015-10-20
相关资源
最近更新 更多