1

我目前正在将一些遗留代码移植到使用 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);  

}  
4

2 回答 2

0

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

  • 在这个答案中使用@Embedded
  • 或使用带有类似查询的@NamedNativeQuery

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

并在二传手:

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

请注意,第二个解决方案确实是一种解决方法。我会优先映射所有列并在实体之外进行计算

于 2012-11-15T02:22:17.653 回答
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)...
}
于 2012-11-18T20:17:11.657 回答