我目前正在将一些遗留代码移植到使用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);
}
答案 0 :(得分:0)
我认为你不能告诉JPA开箱即用映射到阵列。您需要映射每个列并执行一些自定义代码来创建数组:
或将@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)...
}