2013-06-01 57 views
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相同的結構就像名字是關鍵和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,因爲這是關係到義人與RT中我能得到這樣的客戶,地址,銷售訂單等任何實體。(所有的實體是類型JPA類),並有例如類名和類名的prosperites和價值

這裏的類是

@Entity 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 

    private String firstName; 
    private String lastName; 

回答

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 
} 

UPDATE
或者,如果你喜歡的庫,你可以使用來自Apache Commons Lang的ReflectionToStringBuilder。我不知道默認的ToStringStyle是否是你需要的,但它可能很容易進行子類化。

+1

要非常小心這種方法,因爲在使用JPA實體時,您可能會獲得動態生成的CGLib或Javassist代理,而不是實際類的實例。你最好使用訪問器而不是直接獲取字段。並且確保不要遞歸地瀏覽關聯,因爲你會有無限循環,並且/或者你會將整個數據庫加載到內存中。 –

+0

@ JBNizet - 是的,我認爲這是一種複雜的,你認爲我可以使用某種類型的數組,並從那裏獲取數據,因爲返回數據的結構應該始終相同... –

+1

@JohnJerrby:不。將對象轉換爲數組只會導致ClassCastException,因爲您的實體不是數組。通常通過在每個實體中實現一個toString()方法來解決這些問題。要麼你必須使用像這裏建議的反射,或者你必須測試你的實體的類型,並調用特定於該實體類型的方法來顯示它包含的數據。 –

3

如果你要打印的數據在控制檯/日誌,我認爲這是作爲覆蓋容易Person類中的toString()方法。

+0

假設我重寫toString我應該如何獲取數據,例如只是爲實體名稱或只是字段名稱或值,我在我的文章中提供的打印是從toString ... –

相關問題