【问题标题】:ClassCastException with hibernateClassCastException 与休眠
【发布时间】:2018-03-07 09:22:41
【问题描述】:

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

以下是我的实体:

国家

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

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

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

     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 是您需要的结果。

    【讨论】:

    • 没有。我只需要获取国名和州名。我不需要所有属性
    • 它仍然会从数据库兄弟中获取所有数据。我不能允许这种情况发生。
    • 为什么不呢?那你为什么要映射你的类并使用 HQL?
    • @tdavid 看起来使用了EAGER 加载。如果您将完全提取CountryModel,则可以提取所有相关实体。
    • 因为在项目中相同的实体在不同的地方使用。在所有地方,您都不需要全部数据。如果你这样做,你会给 DB 带来不必要的负载
    【解决方案2】:

    当您使用投影时,Hibernate 返回 List&lt;Object[]&gt;List&lt;Object[]&gt; 是指定投影列的列表。

    一些链接

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

    How to transform a flat result set using Hibernate

    【讨论】:

    • 它是否适用于非 sql 查询。我不能使用本机查询
    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2018-12-18
    • 2015-03-13
    • 2013-03-16
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多