Hibernate:将HQL查询切换到SQL查询,抛出异常:java.lang.ClassCastException

时间:2018-02-10 00:34:19

标签: java sql hibernate spring-mvc hql

在我的DaoImpl类中,我试图获取类型TBatchEntry(模型类)的数据列表

@Override
public List<TBatchEntry> getBatchListFormQuery(String batchNo) {

    session = sessionFactory.openSession(); 
    List<TBatchEntry> batchListFromQuery = new ArrayList<TBatchEntry>();
    try {           
        tx = session.beginTransaction();
        batchListFromQuery =  session.createSQLQuery("SELECT * FROM pghms.t_batchentry WHERE t_regNo LIKE '2008%'").list(); 
        tx .commit();           
    }catch(Exception e) {       
        e.printStackTrace();
        session.getTransaction().rollback();            
    }
    return batchListFromQuery;
}

在我的Controller类中,我正在尝试打印值,但它在注释行中抛出错误:

List<TBatchEntry> batchListFromQuery = new ArrayList<TBatchEntry>();

try{
        batchListFromQuery = adminService.getBatchListFormQuery(batchNo);
 }catch(Exception e){
        e.printStackTrace();
 }
Iterator its = batchListFromQuery.iterator();
    while(its.hasNext()){
        batchFromQuery = (TBatchEntry) its.next();  //This line thorws error
        System.out.println(batchFromQuery.getName());
    }

这是我的实体类

@Entity
@Table(name="t_batchEntry")
public class TBatchEntry {

  @Id
  @Column(name="t_regNo")
  private String regNo;
  @Column(name="t_name")
  private String name;

  public String getRegNo() {
    return regNo;
  }
  public void setRegNo(String regNo) {
    this.regNo = regNo;
  }
 public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }

}

tomcat`root原因的日志

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sv.pghms.model.TBatchEntry 

如果有人可以帮助我,我真的很感激。

3 个答案:

答案 0 :(得分:1)

尝试这种方式只需更改班级名称和条件。这对我有用。 希望这对你有用。

List<Book> books = this.sf.getCurrentSession().createSQLQuery("select * from Book where book_id > 3")
                         .addEntity(Book.class)
                          .list();
    for (Book book : books) {
        System.out.println("Book Names are :: " + book.getBookName());
    }

答案 1 :(得分:0)

为什么要将TBatchEntry捕获到Object类中。您可以直接捕获到TBatchEntry类。 将Object []更改为TBatchEntry类,因为您正在从TBatchEntry表中选择所有列,尝试下面的代码,我认为它会起作用,

1)来自Controller,

列出batchListFromQuery = new ArrayList&lt;&gt;(); 使用foreach循环显示记录

更改返回类型如下:

    @Override
public List<TBatchEntry> getBatchListFormQuery(String batchNo) {
  session = sessionFactory.openSession(); 
    List<TBatchEntry> batchListFromQuery = new ArrayList<>();
    try {           
        tx = session.beginTransaction();
        batchListFromQuery =  session.createSQLQuery("SELECT * FROM pghms.t_batchentry WHERE t_regNo LIKE '2008%'").list(); 
        tx .commit();           
    }catch(Exception e) {       
        e.printStackTrace();
        session.getTransaction().rollback();            
    }
    return batchListFromQuery;
}

答案 2 :(得分:0)

经过一番研究,我理解了HQL与HVD之间的区别。 hibernate中的SQL查询。

<connectionstrings>
        <add name="ApplicationDbContext"  connectionstring="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Vidly.Models.ApplicationDbContext.mdf;Integrated Security=True;User Instance=True  " providername="System.Data.SqlClient" />
</connectionstrings>

如果使用HQL查询:

List<TBatchEntry> batchListFromQuery = new ArrayList<TBatchEntry>();

如果使用SQL查询:

batchListFromQuery = session.createQuery(sql).list()

区别在于:

<强> .addEntity(TBatchEntry.class)