【发布时间】:2017-12-16 11:24:38
【问题描述】:
我将 Java8 与 Spring、Hibernate、JPA 和 MySQL 结合使用。
我有以下表格:
+----------+ +-----------------+ +-----------+
| PERSON | | RATING_PERSON | | RATING |
+----------+ +-----------------+ +-----------+
| ID | | PER_ID | | ID |
| | | RAT_ID | | |
+----------+ +-----------------+ +-----------+
然后执行以下代码:
@Override
public List<Rating> findByRatedBy(Long personId) {
StringBuilder sb = new StringBuilder();
sb.append(" SELECT * FROM ebdb.rating as r ");
sb.append(" WHERE r.ID = (SELECT rp.RAT_ID ");
sb.append(" from ebdb.rating_person as rp where rp.PER_ID = :perId) ");
// sb.append(" SELECT r.* FROM ebdb.rating as r ");
// sb.append(" INNER JOIN ebdb.rating_person as rp ON r.ID = rp.RAT_ID ");
// sb.append(" WHERE rp.PER_ID = :perId ");
Query q = entityManager.createNativeQuery(sb.toString(), Rating.class);
q.setParameter("perId", personId);
List<Rating> ratings = (List<Rating>) q.getResultList();
return ratings;
}
但是得到以下错误:
WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-7) SQL Error: 0, SQLState: S0022 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-7) Column 'PER_ID' not found.
当我在 MySQLWorkbench 中运行完全相同的 SQL 语句时,它的执行没有问题。
SELECT * FROM ebdb.rating as r WHERE r.ID = (SELECT rp.RAT_ID from ebdb.rating_person as rp where rp.PER_ID = 385)
问题
谁能告诉我如何让 Hibernate Native Query 执行这个 SQL?
谢谢
更新
我尝试删除Rating.class,即更改:
Query q = entityManager.createNativeQuery(sb.toString(), Rating.class);
到:
Query q = entityManager.createNativeQuery(sb.toString());
这部分解决了问题。
我确实得到了一个结果集:
List<Rating> ratings = (List<Rating>) q.getResultList();
ratings的值:
[[Ljava.lang.Object;@5b5c9618]
但是,当我尝试使用 ratings:
for (Rating rating : ratings) {
...
}
我收到以下错误:
[Ljava.lang.Object; cannot be cast to com.jobs.spring.domain.Rating
更多信息:
Rating.java
@Entity
@Table(name="rating")
@XmlRootElement(name="rating")
public class Rating extends AbstractDomain<Long> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "STARS", nullable = false)
private Long rating;
@Size(min=0, max=500)
@Column(name = "REVIEW", nullable = false)
private String review;
@Column(name = "REVIEW_DATE", nullable = false)
private Long reviewDate;
@ManyToOne(fetch=FetchType.EAGER)
@JoinTable
(
name="rating_job",
joinColumns={ @JoinColumn(name="RAT_ID", referencedColumnName="ID") },
inverseJoinColumns={ @JoinColumn(name="JOB_ID", referencedColumnName="ID") }
)
private Job job;
@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable
(
name="rating_person",
joinColumns={ @JoinColumn(name="RAT_ID", referencedColumnName="ID") },
inverseJoinColumns={ @JoinColumn(name="PER_ID", referencedColumnName="ID") }
)
private Person person;
@Column(name = "ANONYMOUS", nullable = false)
private Integer anonymous;
@XmlElement
public Integer getAnonymous() {
return anonymous;
}
public void setAnonymous(Integer anonymous) {
this.anonymous = anonymous;
}
@XmlElement
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@XmlElement
public Long getRating() {
return rating;
}
public void setRating(Long rating) {
this.rating = rating;
}
@XmlElement
public String getReview() {
return review;
}
public void setReview(String review) {
this.review = review;
}
@XmlElement
public Long getReviewDate() {
return reviewDate;
}
public void setReviewDate(Long reviewDate) {
this.reviewDate = reviewDate;
}
@XmlElement
public Job getJob() {
return job;
}
public void setJob(Job job) {
this.job = job;
}
@XmlElement
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
【问题讨论】:
-
谢谢,从
createNativeQuery中删除Rating.class解决了我的问题。 -
但是,现在当我尝试使用该对象时,我得到了
[Ljava.lang.Object; cannot be cast to com.jobs.spring.domain.Rating。 -
你能分享你的实体类评级吗?
-
@Darshit Chokshi,感谢您的回复。我已经在上面的
More info部分添加了它。
标签: java mysql sql hibernate jpa