0

我使用以下代码从 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],

这里的结果是针对人的,但它可以针对每个实体,结果与实体名称(这里是人)和键 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;
4

2 回答 2

3

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

于 2013-06-01T11:40:18.733 回答
2

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

 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 是否是您需要的,但它可能很容易进行子类化。

于 2013-06-01T11:58:42.180 回答