Java Hibernate本机查询错误:未找到列
我将Java8与Spring、Hibernate、JPA和MySQL一起使用 我有以下表格:Java Hibernate本机查询错误:未找到列,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,我将Java8与Spring、Hibernate、JPA和MySQL一起使用 我有以下表格: +----------+ +-----------------+ +-----------+ | PERSON | | RATING_PERSON | | RATING | +----------+ +-----------------+ +-----------+ | ID | | PER_ID | |
+----------+ +-----------------+ +-----------+
| 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;
}
当我在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本机查询执行这个SQL吗
谢谢
更新
我尝试删除评级.class
,即更改:
Query q = entityManager.createNativeQuery(sb.toString(), Rating.class);
致:
这部分地解决了问题
我确实得到了一个结果集:
List<Rating> ratings = (List<Rating>) q.getResultList();
但是,当我尝试使用评级时
:
[[Ljava.lang.Object;@5b5c9618]
for (Rating rating : ratings) {
...
}
我得到以下错误:
更多信息:
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;
}
}
@实体
@表(name=“评级”)
@XmlRootElement(name=“评级”)
公共类评级扩展了抽象域{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“STARS”,null=false)
私人长期评级;
@尺寸(最小值=0,最大值=500)
@列(name=“REVIEW”,nullable=false)
私人字符串审查;
@列(name=“REVIEW\u DATE”,null=false)
私人长评论;
@manytone(fetch=FetchType.EAGER)
@可接合
(
name=“评级工作”,
joinColumns={@JoinColumn(name=“RAT\u ID”,referencedColumnName=“ID”)},
inverseJoinColumns={@JoinColumn(name=“JOB\u ID”,referencedColumnName=“ID”)}
)
私人工作;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@可接合
(
name=“评级人”,
joinColumns={@JoinColumn(name=“RAT\u ID”,referencedColumnName=“ID”)},
inverseJoinColumns={@JoinColumn(name=“PER_ID”,referencedColumnName=“ID”)}
)
私人;
@列(name=“ANONYMOUS”,nullable=false)
私有整数匿名;
@XmlElement
公共整数getAnonymous(){
匿名返回;
}
公共void setAnonymous(整数匿名){
this.anonymous=匿名;
}
@XmlElement
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@XmlElement
公众长期评级(){
回报率;
}
公共评级(长期评级){
这个。评级=评级;
}
@XmlElement
公共字符串getReview(){
回报审查;
}
公共void setReview(字符串审阅){
这个。回顾=回顾;
}
@XmlElement
公共长getReviewDate(){
返回审核日期;
}
公共无效设置审核日期(长审核日期){
this.reviewDate=reviewDate;
}
@XmlElement
公共作业getJob(){
返回工作;
}
公共无效设置作业(作业作业){
这个工作=工作;
}
@XmlElement
公众人物{
返回人;
}
公众人士{
这个人=人;
}
}
我不确定本机查询为什么不起作用,但我通过使用hibernate查询解决了这个问题:
@Override
public List<Rating> findByRatedBy(Person person) {
final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class);
Root<Rating> root = criteria.from(Rating.class);
ParameterExpression<Job> paramJob = criteriaBuilder.parameter(Job.class);
ParameterExpression<Person> paramPerson = criteriaBuilder.parameter(Person.class);
criteria.select(root).where(
criteriaBuilder.equal(root.get("person"), paramPerson)
);
List<Order> orderList = new <Order>ArrayList();
orderList.add(criteriaBuilder.desc(root.get("reviewDate")));
criteria.orderBy(orderList);
TypedQuery<Rating> queryRating = entityManager.createQuery(criteria);
queryRating.setParameter(paramPerson, person);
List<Rating> results = null;
results = queryRating.getResultList();
return results;
}
@覆盖
由(个人)查找的公共列表{
最终EntityManagerFactory EntityManagerFactory=entityManager.getEntityManagerFactory();
最终CriteriaBuilder CriteriaBuilder=entityManagerFactory.getCriteriaBuilder();
CriteriaQuery criteria=criteriaBuilder.createQuery(Rating.class);
根根=标准.from(评级.class);
ParameterExpression paramJob=criteriaBuilder.parameter(Job.class);
ParameterExpression paramPerson=criteriaBuilder.parameter(Person.class);
条件。选择(根)。其中(
criteriaBuilder.equal(root.get(“person”)、paramPerson)
);
List orderList=new ArrayList();
add(criteriaBuilder.desc(root.get(“reviewDate”));
标准。订购人(订单列表);
TypedQuery queryRating=entityManager.createQuery(条件);
queryRating.setParameter(paramPerson,person);
列表结果=空;
结果=queryRating.getResultList();
返回结果;
}
检查此项谢谢,从createNativeQuery
中删除评级.class
解决了我的问题。但是,现在当我尝试使用该对象时,我得到了[Ljava.lang.Object;无法转换为com.jobs.spring.domain.Rating
。您能分享您的实体类评级吗?@Darshit Chokshi,谢谢您的回复。我已将其添加到上面的更多信息
部分。
[Ljava.lang.Object; cannot be cast to com.jobs.spring.domain.Rating
@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;
}
}
@Override
public List<Rating> findByRatedBy(Person person) {
final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class);
Root<Rating> root = criteria.from(Rating.class);
ParameterExpression<Job> paramJob = criteriaBuilder.parameter(Job.class);
ParameterExpression<Person> paramPerson = criteriaBuilder.parameter(Person.class);
criteria.select(root).where(
criteriaBuilder.equal(root.get("person"), paramPerson)
);
List<Order> orderList = new <Order>ArrayList();
orderList.add(criteriaBuilder.desc(root.get("reviewDate")));
criteria.orderBy(orderList);
TypedQuery<Rating> queryRating = entityManager.createQuery(criteria);
queryRating.setParameter(paramPerson, person);
List<Rating> results = null;
results = queryRating.getResultList();
return results;
}