带有hibernate的ClassCastException

时间:2018-03-07 09:22:41

标签: java hibernate orm

我正在尝试从我的实体中获取特定字段。我需要在我的实体结构中得到结果。

以下是我的实体:

国家

public class CountryModel {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CmtID")
    private int id;
    @Column(name = "CmtName")
    private String name;
    @JoinColumn(name="CmtStateID")
    @OneToMany(targetEntity=StateModel.class,fetch=FetchType.EAGER)
    private List<StateModel> state;
}

国家

public class StateModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "SmtID")
    private int id;
    @Column(name = "SmtName")
    private String name;
}

以下是正在执行的HQL查询:

Query query = session.createQuery("select c.name, s.name from CountryModel c join c.state s where c.id=2");
CountryModel stateModel = (CountryModel) query.uniqueResult();

但是我收到以下错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.muziris.entity.CountryModel

感谢您的帮助。

预期结果:

Country :
        name : india
        state : 
              name : kerala
              name : goa
        name : Pak
        state :
              name : karachi

2 个答案:

答案 0 :(得分:0)

由于您的类已映射,您可以尝试:

 Query query = session.createQuery("from CountryModel c where c.id=2");
 CountryModel countryModel = (CountryModel) query.uniqueResult();

让我们使用映射和HQL。

从那里你可以使用DTO只拥有你需要的数据

public CountryDTO transform(CountryModel cm){
String countryName = cm.getName();
List<String> stateNames = cm.getState().stream.map(StateModel::getName)
                                              .collect(Collectors.toList());
return new CountryDTO(countryName, stateNames);
}

CountryDTO是您需要的结果。

答案 1 :(得分:0)

使用投影时,Hibernate会返回List<Object[]>List<Object[]>是指定投影列的列表。

一些链接

https://stackoverflow.com/a/36883968/3405171

How to transform a flat result set using Hibernate