将多个JPA列映射到单个Array

时间:2012-11-15 02:10:48

标签: 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 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);  

}  

2 个答案:

答案 0 :(得分:0)

我认为你不能告诉JPA开箱即用映射到阵列。您需要映射每个列并执行一些自定义代码来创建数组:

  • this回答
  • 中使用@Embedded
  • 或将@NamedNativeQuery与

    之类的查询一起使用

    SELECT Date,concact(R1,',',R2,',',R3,...)AS R FROM MYTABLE

并在二传手中:

public void setR(String r) {
  String[] myarray = r.split(',');
  // Convert String[] to int[] and compute sum
}

请注意,第二种解决方案实际上是一种解决方法。我将特权映射所有列并在实体外进行计算

答案 1 :(得分:0)

使用@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)...
}