Значение параметра [2] не соответствует ожидаемому типу [com.cityBike.app.model.User
Я получаю ошибку
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.BaseQueryImpl.setParameter(BaseQueryImpl.java:631) в org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:180) в org.hibernate.jpa.spi.AbstractQueryImplset.set.tmp.jp. com.cityBike.app.service.RentService.getAllByUser(RentService.java:22)
Ниже приведен фрагмент кода, как я могу исправить эту проблему?
Файл 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;
...
Файл User.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" при отображении на консоли является правильным, поскольку он имеет такое числовое значение ex. 2 или 3. Пожалуйста, руководство и помощь.
2 ответа
Тип Rent.user_id
Пользователь, поэтому, когда вы передаете int
на запрос
from Rent a where a.user_id = :user_id
вы сравниваете User
с int
,
Вместо этого вам нужно написать
from Rent a where a.user_id.id = :user_id
Я бы порекомендовал переименовать Rent.user_id
в Rent.user
чтобы избежать такого рода ошибок.
Вы можете использовать этот запрос:-
user_id
в Rent
класс не int это объект типа User
так что вы должны получить 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();