1

JPA から Sybase ストアド プロシージャを呼び出し、その値を Transient オブジェクトに返す必要があります。このオブジェクトは、別の永続オブジェクトに入力するために使用されます。

これは私がやったことです:

@Entity
public class CBSCustomer {
String cpr;
<--snipped-->

@Id
@Transient
public String getCpr() {
    return cpr;
}

<---snipped-->

}

Bean で SP を呼び出します。

List<CBSCustomer> fetchedCustomerList = getEmPhoenix().createNativeQuery("{call sp_name(?)}", CBSCustomer.class).setParameter(1, cprInput).getResultList();

if (fetchedCustomerList.size() > 0) {              
          CBSCustomer cbsCustomer = ((CBSCustomer)fetchedCustomerList.get(0));
          setDisabled(true);
      }

残念ながら、列名に関するエラー、つまり「x の列名が無効です」というエラーが表示され続けます。ここで、x は CBSCustomer のフィールドのプレースホルダーです。

4

1 に答える 1

1

たくさんのテストの後、これが私がやった方法です。それが他の人を助けることができることを願っています。

1)結果セットマッピング用の@Entity POJOを作成し、すべてのフィールドに@Transientで注釈を付ける必要があります。

2)そのクラスに@ResultSetMappingアノテーションが必要です。例:

@SqlResultSetMapping(
name="CBSCustomer",
entities={
    @EntityResult(
        entityClass=CBSCustomer.class,
        fields={
            @FieldResult(name="name", column="Name"),
            @FieldResult(name="cpr", column="CPR"),
<--snipped-->
        }
    )
}

3)これで、ストアドプロシージャを呼び出し、createNativeQueryの「CBSCustomer」エイリアスを使用してこのフィールドにマップできます。

createNativeQuery("{call procedure(?)}", "CBSCustomer")
于 2012-09-20T11:01:12.777 に答える