Java Hibernate本机查询错误:未找到列

Java Hibernate本机查询错误:未找到列,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,我将Java8与Spring、Hibernate、JPA和MySQL一起使用 我有以下表格: +----------+ +-----------------+ +-----------+ | PERSON | | RATING_PERSON | | RATING | +----------+ +-----------------+ +-----------+ | ID | | PER_ID | |

我将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;
    }
当我在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;
}