【发布时间】:2014-11-01 01:15:02
【问题描述】:
更新
虽然我不会删除此问题,但如果提供的答案有助于将来帮助某人,则与此问题相关的项目因其他原因而被放弃。
问题
是否可以根据字段名称映射到表示数据库行的字符串值中的数据创建 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 实体管理器已经做过并且知道的事情如何处理托管实体。
【问题讨论】:
标签: java entity-framework jpa map eclipselink