![](/img/trans.png)
[英]What is the most efficient way to map/transform/cast a Cassandra BoundStatement's ResultSet to a Java classe built using the Object-mapping API?
[英]What's the best way to map the resultset to object
假设有2个表:PERSON和TELEPHONE。
一个人可以拥有多个电话。 一个电话号码只能由一个人拥有。
当我加入两个表时,返回的结果集是
P_ID NAME TEL_NO
1 ALVIN 911
1 ALVIN 912
1 ALVIN 913
2 ERIC 922
2 ERIC 923
但是在我的HTML中,我想将页面显示为:
ID: 1 Name : ALVIN TEL_NO: 911, 912, 913
ID: 2 Name : ERIC TEL_NO: 922, 923
如上所示,读取结果集和显示数据的最有效方法是什么?
如果我遍历ResultSet并将其打印在页面上。 它将有多个具有相同名称的行,分别是ALVIN和ERIC。 但是我想在同一行上打印同一个人的所有TEL_NO。
我有一个存储PERSON详细信息的Java类。
public class Person {
public int id;
public String name;
public List<Integer> telNos = new ArrayList<Integer>();
}
List<Person> persons = new ArrayList<Person>;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
while(resultSet.next()) {
int pId = resultSet.getInt("P_ID");
String name = resultSet.getString("NAME");
int telNo = resultSet.getInt("TEL_NO");
if(map.containsKey(pId)){
Person person = persons.get(map.get(pId));
person.telNos.add(telNo);
} else {
Person person = new Person();
person.id = pId;
person.name = name;
person.telNos.add(telNo);
map.put(pId, persons.size());
persons.add(person);
}
}
最后,我将这些人员传递给JSP进行显示。
我的问题是:有没有更好的方法来循环和显示ResultSet,而在html表的不同行上没有相同的P_ID。
最好且有效的方法是,您可以使用将在Java Script和HTML中使用的JQuery Data Tables插件。
使用Java脚本,它也可以在任何可以动态处理网页数据的地方正常工作。
首先,我将运行两个查询以获取PERSON
和TELEPHONE
数据。 像这样:
Map<Integer, Person> people = new HashMap<Integer, Person>();
ResultSet resultSet = [some query on PERSON];
while(resultSet.next()) {
Person p = [make a person]
people.add(p.id, p);
}
resultSet = [some query on TELEPHONE];
while(resultSet.next()) {
people.get(resultSet.getInt("P_ID")).telNos.add(resultSet.getInt("TEL_NO"));
}
这将为您提供要使用的Person
对象的完整列表(无重复)。 如果性能是一个很大的问题(并且我每秒至少要处理数百个请求,也许是数千个),那么您可能需要坚持一个查询。 在那种情况下,您的代码想法或多或少都很好,但是我会抛弃ArrayList<Person>
并使用Map<Integer, Person>
像这样:
Map<Integer, Person> people = new HashMap<Integer, Person>();
while(resultSet.next()) {
int pId = resultSet.getInt("P_ID");
if (!people.containsKey(pId)) {
people.add(pId, [build a new person]);
}
people.get(pId).telNos.add(resultSet.getInt("TEL_NO"));
}
您可以通过调用people.values()
获得完整的人员列表。
然后,在模板中,您可以遍历telNos
列表,将它们组合成一个逗号分隔的列表。 假设您已经遍历了您的人员,并且可以在p
找到当前Person
,例如
<c:forEach items="#{p.telNos}" var="t" varStatus="loop"> ${t}${!loop.last ? ', ' : ''} </c:forEach>
(或多或少从这里获取 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.