将多个JPA列映射到单个数组
我目前正在使用JPA移植一些遗留代码,在试图将其中一个表简化为实体时遇到了问题 我有一个24小时内每半小时采集的各种读数表。 它看起来像:将多个JPA列映射到单个数组,jpa,Jpa,我目前正在使用JPA移植一些遗留代码,在试图将其中一个表简化为实体时遇到了问题 我有一个24小时内每半小时采集的各种读数表。 它看起来像: Date |R1|R2|R3...R48 1/1/2012,1,5,1,3,3,4,5,5....etc 我希望我的实体bean看起来像: @Entity public class Reading { @Id String date; @?? int[] values; @??? int su
Date |R1|R2|R3...R48
1/1/2012,1,5,1,3,3,4,5,5....etc
我希望我的实体bean看起来像:
@Entity
public class Reading {
@Id
String date;
@??
int[] values;
@???
int sumOfValues
}
有什么建议可以帮助我解决这个问题吗?有可能吗?此外,我只想阅读这些值,如果这使它更容易。
我在MongoDB中使用EclipseLink 2.4
**更新**
几乎拥有它-但需要以某种方式保持顺序(我认为字段映射的顺序不正确)-或传递对列名的引用:
@Entity
@Customizer (RawDataCustomizer.class)
public class Reading {
private List<Integer> values...
public void setValue(Integer value)...
public static class RawDataCustomizer implements DescriptorCustomizer {
@Override
public void customize(ClassDescriptor descriptor) throws Exception {
//loses ordering?
for (int i=1; i<=48; i++)
descriptor.addDirectMapping("R"+i, "getValue", "setValue", "r"+i);
}
@实体
@定制器(RawDataCustomizer.class)
公开课阅读{
私有列表值。。。
公共无效设置值(整数值)。。。
公共静态类RawDataCustomizer实现DescriptorCustomizer{
@凌驾
public void customize(类描述符描述符)引发异常{
//失去秩序?
对于(int i=1;i我认为您不能告诉JPA立即映射到数组。您需要映射每个列,并执行一些自定义代码来创建数组:
- 在答案中使用@Embedded like
- 或者将@namedNaviQuery与类似的查询一起使用
从MYTABLE中选择日期,conact(R1’,’,R2’,’,R3,…)作为R
在setter中:
public void setR(String r) {
String[] myarray = r.split(',');
// Convert String[] to int[] and compute sum
}
注意,第二种解决方案实际上是一种变通方法。我有权映射所有列,并使用@Customizer(一点也不理想)在实体外部进行计算最终解决方案,但目前效果很好:
public static class RawDataMapping extends EISDirectMapping {
private final int index;
public RawDataMapping(int index, String attributeName,String fieldName) {
super();
this.index = index;
setAttributeName(attributeName);
setFieldName(fieldName);
setAttributeAccessor(new CustomAccessorAttributeAccessor(this));
}
public void set(Object object, Object value)...
public Object get(Object object)...
}
我更喜欢@Embedded方法——但实际上这只会给我一个充满离散字段的类,转换为数组仍然很难。理想情况下,我喜欢@Embedded R;公共静态类R{@Collection(“rs”)private int r1;private int r2…public List getRs();}