我正在解决这个问题。
我有3节课
User和Park具有ManyToMany关系,而Piano和Park具有ManyToOne关系。
在模型中,有趣的部分是
User.java
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="users_parcheggio", joinColumns = {@JoinColumn(name="user_id") }, inverseJoinColumns = {
@JoinColumn(name="park_id") })
private Set<Park> parks = new HashSet<Park>();
这是Park.java
@Entity
@Table(name="parcheggio", catalog="SMARTPARK")
public class Park implements Serializable{
/**
*
*/
private static final long serialVersionUID = -7630704706109692038L;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_park", unique = true, nullable = false)
private int idPark;
@NotEmpty
@Column(name="nome_park")
private String nomePark;
@Column(name="descrizione")
private String descrizione;
@Column(name="indirizzo")
private String indirizzo;
@Column(name="citta")
private String citta;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="users_parcheggio", joinColumns = {@JoinColumn(name="park_id") }, inverseJoinColumns = {
@JoinColumn(name="user_id") })
private Set<User> users = new HashSet<User>();
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy = "park")
private List<Piano> piano;
public Park(){
}
public Park(int idPark, String nomePark, String descrizione, String indirizzo, String citta, Set<User> users, List<Piano> piano){
this.idPark = idPark;
this.nomePark = nomePark;
this.descrizione = descrizione;
this.indirizzo = indirizzo;
this.citta = citta;
this.users = users;
this.piano = piano;
}
public List<Piano> getPiano() {
return piano;
}
public void setPiano(List<Piano> piano) {
this.piano = piano;
}
public int getIdPark() {
return idPark;
}
public void setIdPark(int idPark) {
this.idPark = idPark;
}
public String getNomePark() {
return nomePark;
}
public void setNomePark(String nomePark) {
this.nomePark = nomePark;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
public String getIndirizzo() {
return indirizzo;
}
public void setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
}
public String getCitta() {
return citta;
}
public void setCitta(String citta) {
this.citta = citta;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + idPark;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Park other = (Park) obj;
if (idPark != other.idPark)
return false;
return true;
}
}
和在Piano.java中
@ManyToOne
@JoinColumn(name = "id_park")
public Park getPark() {
return park;
}
public void setPark(Park park) {
this.park = park;
}
当我在夫妇中使用这3个 class 时(Park的用户或Park的钢琴),一切都进行得很好,但是现在我必须为给定的用户获得所有的Piano。
在我的PianoDaoImpl中,我有这种方法
public List<Piano> findPianoByUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName();
User user = userService.findBySso(name);
int userId = user.getId();
Query q = getSession().createQuery("from Park p join p.users u where u.id = :userId").setParameter("userId", userId);
List<Park> parks = q.list();
Query query = getSession().createQuery("from Piano p where p.park in :parks").setParameterList("parks", parks);
List piani = query.list();
return piani;
}
q查询为我正确提供了公园列表。然后,我将此列表传递给第二个查询,但出现了此异常
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.PropertyAccessException: could not get a field value by reflection getter of it.besmart.models.Park.idPark
由...引起
java.lang.IllegalArgumentException: Can not set int field it.besmart.models.Park.idPark to [Ljava.lang.Object;
我做错了什么?
最佳答案
问题的原因是引用类型idPark
的Integer
不能被分配原始类型int
的值。
尝试替换它。
@Column(name = "id_park", unique = true, nullable = false)
private Integer idPark;
带有:
@Column(name = "id_park", unique = true, nullable = false)
private int idPark;
尝试检查
userId
的值是否为Integer
而不是int
,因为我认为与此不同的是: "from Park p join p.users u where u.id = :userId").setParameter("userId", userId);