使用Java和Hibernate中的几个表检索POJO查询

时间:2014-05-08 14:11:01

标签: java hibernate netbeans hql hibernate-mapping

我是Hibernate的新手,所以我还在学习如何做容易的事情。 我有以下简单的关系模型: enter image description here

我已经配置了所有Hibernate XML文件,并完成了我的数据库的映射。所有POJO和XML都很好,因为NetBeans'所有这三个查询都运行HQL编辑器没有任何问题:

from Device
from Site
from Country

如果我运行以下代码,一切正常:

public void getAllDevices() throws Exception {
        List<Device> devicesList = (List<Device>) session.createQuery("from Device").list();
        int size = devicesList.size();
        System.out.println("Size was " + size);
        for(int i=0; i<size; i++){
            System.out.println(devicesList.get(i).getDeviceOperationsName());
        }
}

但是,如果我尝试运行更复杂的查询(不是那么复杂......):

FROM Device As device
     INNER JOIN device.site
     INNER JOIN device.site.country
WHERE device.site.country.countryCode = 'ES'

的NetBeans&#39; HQL编辑器运行它没有问题,但是当在上面的Java代码(替换"from Device")中使用时,它会引发以下错误,引用System.out.println行:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Entity.Device
        at DAO.MasterDataDAO.getAllDevices(MasterDataDAO.java:41)
        at CapaDominio.Main.main(Main.java:40)

看来Hibernate正在尝试填充设备POJO列表,而查询实际上是从几个表返回数据。我希望Hibernate不仅可以填充设备,还可以填充国家和站点表,而我可以管理返回的List<Device>中的所有数据,并从每个Device对象导航到其他相应的对象。

拜托,任何人都可以指出我做错了什么或不理解?如何实现管理对象所需的方法(获取设备列表并迭代它们)?

谢谢!

2 个答案:

答案 0 :(得分:1)

好的,我在搜索了更多关于这个问题并清除了一些关于Hibernate如何工作的错误假设后,终于能够自己解决问题了。 正确的代码(已经测试过)应该是:

public void getAllDevices() throws Exception {
        List<Device> devicesList = (List<Device>) session.createQuery("SELECT device " +
            "FROM Device As device " +
                "INNER JOIN device.site " +
                "INNER JOIN device.site.technology " +
                "INNER JOIN device.site.country " +
            "WHERE device.site.country.countryCode = 'ES'").list();
        int size = devicesList.size();
        System.out.println("Size was " + size);
        for(int i=0; i<size; i++){
            System.out.println(d.getDeviceOperationsName() + " in site " + d.getSite().getSiteName()
                    + " with technology " + d.getSite().getTechnology().getTechnologyName()
                    + " in country " + d.getSite().getCountry().getCountryName());
        }
}

此代码中与初始代码的主要区别在于:

  • 我的查询现在包括SELECT device。这表明我只想从Device表中检索数据的Hibernate。但是,我的查询与其他表连接,以便能够获取这些表&#39;数据后缀,从每个设备对象导航。
  • System.out.println包含了我提到的其他对象(表格)的一些导航。

这很完美,符合我的期望:) 希望它可以帮助别人。

答案 1 :(得分:0)

它似乎没有正确指定你的PK_FK关系以正确的方式指定关系并使用级联。什么时候你将获得Device对象所有依赖对象获取。