Hibernate:将 HQL 查询切换为 SQL 查询,抛出异常:java.lang.ClassCastException
Hibernate: Switched HQL query to SQL query, throws exception: java.lang.ClassCastException
在我的 DaoImpl
class 中,我正在尝试获取类型为 TBatchEntry(model class)
的数据列表
@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;
}
在我的控制器中 class 我正在尝试打印值,但它在注释行中抛出错误:
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());
}
这是我的实体class
@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`根本原因的日志
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sv.pghms.model.TBatchEntry
如果有人能帮助我,我将不胜感激。
为什么要catch TBatchEntry into Object class.You 可以直接catch into TBatchEntry class。
将 Object[] 更改为 TBatchEntry Class,因为您正在从 TBatchEntry table 中选择所有列,请尝试下面的代码,我认为它会起作用,
1) 来自控制器,
列表 batchListFromQuery = new ArrayList<>();
使用 foreach 循环显示记录
更改 return 类型如下:
@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;
}
尝试这种方式只需更改 class 名称和 condition.It 对我有用的地方。
希望它对你有用。
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());
}
经过一些研究,我了解了 HQL 和 SQL 休眠中查询的区别。
List<TBatchEntry> batchListFromQuery = new ArrayList<TBatchEntry>();
如果使用 HQL 查询:
batchListFromQuery = session.createQuery(sql).list()
如果使用 SQL 查询:
batchListFromQuery = session.createSQLQuery(sql).addEntity(TBatchEntry.class).list();
区别是:
.addEntity(TBatchEntry.class)
在我的 DaoImpl
class 中,我正在尝试获取类型为 TBatchEntry(model class)
@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;
}
在我的控制器中 class 我正在尝试打印值,但它在注释行中抛出错误:
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());
}
这是我的实体class
@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`根本原因的日志
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sv.pghms.model.TBatchEntry
如果有人能帮助我,我将不胜感激。
为什么要catch TBatchEntry into Object class.You 可以直接catch into TBatchEntry class。 将 Object[] 更改为 TBatchEntry Class,因为您正在从 TBatchEntry table 中选择所有列,请尝试下面的代码,我认为它会起作用,
1) 来自控制器,
列表 batchListFromQuery = new ArrayList<>(); 使用 foreach 循环显示记录
更改 return 类型如下:
@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;
}
尝试这种方式只需更改 class 名称和 condition.It 对我有用的地方。 希望它对你有用。
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());
}
经过一些研究,我了解了 HQL 和 SQL 休眠中查询的区别。
List<TBatchEntry> batchListFromQuery = new ArrayList<TBatchEntry>();
如果使用 HQL 查询:
batchListFromQuery = session.createQuery(sql).list()
如果使用 SQL 查询:
batchListFromQuery = session.createSQLQuery(sql).addEntity(TBatchEntry.class).list();
区别是:
.addEntity(TBatchEntry.class)