从通用结果列表中获取数据并打印出来

时间:2013-06-01 11:24:12

标签: java arrays arraylist

我使用以下代码从JPA获取数据,但是读取调用可以用于任何实体(动态调用),因为结果列表是通用的,但结构总是与此结果相同

Person [firstName=firstName 1, lastName=lastName 1, bigDecimal=0, myDate=Wed Sep 16 06:42:18 IST 1998], 
Person [firstName=firstName 2, lastName=lastName 2, bigDecimal=0, myDate=Sun May 19 13:12:51 IDT 1957], 
Person [firstName=firstName 3, lastName=lastName 3, bigDecimal=0, myDate=Fri Jun 03 05:09:20 IDT 1949],

这里的结果是针对人的,但它可以针对每个实体而且结果具有完全相同的结构 entityname(这里是person)和key val如firstname是键,val是firstname1等

如何从结果列表中打印出来,比如实体名称和键值列表以及相应的数据?

这是我用来获取数据的代码。

factory = Persistence.createEntityManagerFactory("abc");
EntityManager entityManager = factory.createEntityManager();
Query query = entityManager.createQuery("SELECT p FROM " + className + " p");

List resultList = query.getResultList();

不能使用像List<Person> resultList这样的定义,因为这只与Person有关,在RT期间,我可以获得客户,地址,销售订单等任何实体(所有实体都是类型) JPA类)并且具有类名和类名称和值的繁荣

例如,这里的类是

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)

    private String firstName;
    private String lastName;

2 个答案:

答案 0 :(得分:3)

如果你想在控制台/日志中打印数据,我认为它就像覆盖Person类中的toString()方法一样简单。

答案 1 :(得分:2)

您可以创建一个使用反射来构建任何对象的字符串表示形式的通用String实用程序。您将获得具有以下内容的字段列表:

 List result = new ArrayList();
 Field[] f = <your object>.getClass().getDeclaredFields();
 for (int i = 0; i < f.length; i++) {
     if (!Modifier.isStatic(f[i].getModifiers())) {
         result.add(f[i]);
     }
 }

 return result.iterator();

然后为每个字段做类似的事情:

 try {
     field.setAccessible(true);
     Object value = field.get(<your object>);
     <String buffer of your generic toString representation>.append(value);
 } catch (IllegalAccessException e) {
     // e.printStackTrace() obviously
 }

更新
或者,如果您喜欢库,可以使用Apache Commons Lang的ReflectionToStringBuilder。我不知道默认的ToStringStyle是否是您需要的,但它可能很容易进行子类化。