簡體   English   中英

從地圖創建JPA實體 <String,String> 代表數據庫行

[英]Creating a JPA Entity from a Map<String,String> representing a database row

UPDATE

雖然我不會刪除此問題,但是如果將來會提供答案以幫助某人,則該問題相關的項目由於其他原因而被放棄。


是否可以基於字段名稱映射為代表數據庫行的字符串值的映射中的數據創建JPA實體類的實例,就像實體管理器將數據庫列名稱的結果集轉換為值到實體一樣?

該項目中使用了EclipseLink 2.4.1,並且可以使用特定於EclipseLink 2.4.1的可公開訪問的方法。

情況

我正在使用Web服務,該服務將通過解釋審核日志來檢索一個或多個數據庫行的狀態,如它們在時間X處的狀態。 這可能不是解決問題的正確方法,但這就是我可以使用的方法。

這將以以下形式返回數據:

{
    "id_column":{
        "value":"5"
        ...*snip*...
    },
    "enum_column":{
        "value":"VALUE_1"
        ...*snip*...
    },
}

在我的代碼中已將其轉換為{“ id_column” =>“ 5”和“ enum_column” =>“ VALUE_1”}的映射。

在此示例中,然后需要將其轉換回一個實體

*snip*

@Table(schema="stackoverflow", name="exampleEntity")
public class StackoverflowExampleEntity {
    @Id
    @Column(name="id_column")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id_column;

    @Enumerated(EnumType.STRING)
    @Column(name="enum_column")
    private StackOverflowExampleEnum enum_column;

    *snip*
}

這個過程必須是通用的,除了這個絆腳石之外,這應該是可能的。

背景

我試圖深入研究EclipseLink源代碼,但是找不到真正在行數據和實體之間進行轉換的代碼部分。

我知道以下內容可以實現我的目標,但是它涉及到數據庫的不必要訪問,並且涉及將潛在的不安全信息嵌入到SQL查詢中(因此存在潛在的SQL注入風險)

Object o = em.createNativeQuery("SELECT '5' AS id_column, 'VALUE_1' AS enum_column", StackoverflowExampleEntity .class).getSingleResult();

我也可以創建一個實體並使用設置器,但是a。)這不是通用解決方案,並且b。)需要將屬性從字符串手動轉換為屬性類型,這是JPA實體管理器已經做過的,並且知道如何做對於托管實體。

我認為您無法按原樣找到想要的東西... EclipseLink(或任何其他框架)中的過程比這還要復雜。

但是您可以在Java中輕松使用反射來獲得所需的內容。 您解析地圖並創建相關對象:地圖的關鍵是要查找的字段,而值是要設置的值。

如果需要示例,可以查找(取消)編組過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM