我是Hibernate的新手,所以我还在学习如何做容易的事情。 我有以下简单的关系模型:
我已经配置了所有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对象导航到其他相应的对象。
拜托,任何人都可以指出我做错了什么或不理解?如何实现管理对象所需的方法(获取设备列表并迭代它们)?
谢谢!
答案 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对象所有依赖对象获取。