1

私は現在、いくつかのレガシー コードを JPA を使用するように移植しており、テーブルの 1 つをエンティティに単純化しようとして問題に遭遇しました。

私は、24 時間の期間中 (30 分ごと) に取得したさまざまな測定値の表を持っています。次のようになります。

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 FROM MYTABLE

そしてセッターで:

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

2 番目の解決策は実際には回避策であることに注意してください。すべての列をマッピングする特権を与え、エンティティの外部で計算を行います

于 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 に答える