我是Java新手,在显示对象列表中的数据方面存在问题。我有一个简单的方法,它应该跨多个表收集数据并将其返回给我的控制器:
public List<Object> getHouseInfo(){
Query q = em.createNativeQuery("SELECT houses.id, addresses.country, addresses.region, house_details.rooms, house_details.square FROM houses, addresses, house_details");
List<Object> myList = q.getResultList();
return myList;}
现在我想在控制器中获取这些数据,但我不知道如何从列表中获取单个结果。我试着做这样的事情:
List<Object> list = getHouseInfo();
for (int i=0; i<list.size; i++){
System.out.println("Element "+i+list.get(0));}
但我只获得对这个对象的引用(例如[Ljava.lang.Object; @ 167a47b)。我也试过使用Iterator,但结果是一样的。我试图使用这样的代码:
List<Object> list = getHouseInfo();
for (int i=0; i<list.size; i++){
System.out.println("Element "+i+list.get(0)[0]);}
但它对我没有帮助 - 这以编译错误结束。
有人可以告诉我如何从这个列表中获取'id'(整数值)吗? 我在我的'View'中使用MyFaces,我有这样的代码(houseControll是我的JSF Managed Bean的名称 - 控制器):
<t:dataList id="myDataList" value="#{houseControll.fullOffer}" var="element" rows="3" >
...
<t:outputText id="houseId" value="#{element[0]}"/>
...
</t:dataList>
此代码正确显示“id”值 - 我有1,2,3,...值。如何在控制器中获得相同的结果?如何在控制器中打印数据?
答案 0 :(得分:14)
对于初学者,你没有正确地迭代结果列表,你根本就没有使用索引i。尝试这样的事情:
List<Object> list = getHouseInfo();
for (int i=0; i<list.size; i++){
System.out.println("Element "+i+list.get(i));
}
看起来查询会重新组合一个对象数组列表,因为数组不是覆盖toString的正确对象,您需要先进行强制转换,然后再使用Arrays.toString()。
List<Object> list = getHouseInfo();
for (int i=0; i<list.size; i++){
Object[] row = (Object[]) list.get(i);
System.out.println("Element "+i+Arrays.toString(row));
}
答案 1 :(得分:4)
这样做
List<Object[]> list = HQL.list(); // get your lsit here but in Object array
您的查询是:“SELECT houses.id,addresses.country,addresses.region,...”
for(Object[] obj : list){
String houseId = String.valueOf(obj[0]); // houseId is at first place in your query
String country = String.valueof(obj[1]); // country is at second and so on....
.......
}
通过这种方式,您可以轻松获得混合对象,但您应该事先知道您获得的值是什么,或者您可以通过打印要知道的值进行检查。对不起英语不好我希望这个帮助
答案 2 :(得分:0)
System.out.println("Element "+i+list.get(0));}
应该是
System.out.println("Element "+i+list.get(i));}
要使用JSF标记,请为dataList value属性提供对元素列表的引用,var属性依次为该列表的每个元素的本地名称。在dataList中,您使用对象的属性(getters)来输出有关该单个对象的信息:
<t:dataList id="myDataList" value="#{houseControlList}" var="element" rows="3" >
...
<t:outputText id="houseId" value="#{element.houseId}"/>
...
</t:dataList>
答案 3 :(得分:0)
你应该尝试这样的事情
List xx= (List) list.get(0)
String id = (String) xx.get(0)
或者如果你有一个House值对象,那么查询的结果是相同的类型,那么
House myhouse = (House) list.get(0);
答案 4 :(得分:0)
全部感谢您的回复。好的解决方案是使用'brain`s'方法:
List<Object> list = getHouseInfo();
for (int i=0; i<list.size; i++){
Object[] row = (Object[]) list.get(i);
System.out.println("Element "+i+Arrays.toString(row));
}
问题解决了。再次感谢。