私は次のことを試みていますが、その結果、追加の更新が実行され、テストに失敗します。私はこのような実体を持っています。
@Entity
@SqlResultSetMapping(name = "tempfilenameRSMapping",
entities = { @EntityResult(entityClass = MyEntity.class) },
columns = { @ColumnResult(name = "TEMPFILENAME") })
//The reason for this mapping is to fetch an additional field data through join.
@Table(name = "MY_TABLE")
public class MyEntity {
@Id
@Column(name="ID")
private String id;
@Column(name="NAME")
private String name;
@Column(name="DESC")
private String description;
@Column(name="STATUS")
private String status;
//follwed by getter setters
}
ネイティブクエリで取得しようとしています。そして、取得したエンティティに対して、ネイティブ更新を実行します(ネイティブ更新の理由は、単一のフィールドのみを更新するためです)。取得したエンティティを直接更新していないことに注意してください。
私が観察しているのは、更新が正しく実行されていないことです。TRACEをオンにすると、フラッシュ時にopenJPAが追加の更新クエリを実行しているため、元の更新をオーバーライドしていることに気付きます。
例えば
SELECT M.ID, M.NAME, M.DESC, O.TEMPFILENAME FROM MY_TABLE M, OTHER_TABLE O WHERE M.ID = ?
UPDATE MY_TABLE SET STATUS = ? WHERE ID = ?
UPDATE MY_TABLE SET ID=?, NAME=?, DESC=?, STATUS=? WHERE ID = ?
自動更新をスキップするにはどうすればよいですか?
編集:クエリを実行するために使用するルーチンは次のとおりです。
次のルーチンは、名前付きのネイティブクエリSQLを返します。
public String getNamedNativeQuerySql(EntityManagerFactory emf, String qryName) {
MetamodelImpl metamodel = (MetamodelImpl) emf.getMetamodel();
QueryMetaData queryMetaData =
metamodel.getConfiguration().getMetaDataRepositoryInstance().getQueryMetaData(null, qryName, null, true);
String queryString = queryMetaData.getQueryString();
return queryString;
}
検索用のコード:
Query query = entityManager.createNamedQuery("retrieveQry");
query.setParameter(1, id);
Object[] result = (Object[]) query.getSingleResult();
MyEntity entity = (MyEntity) result[0];
String tempFileName = (String) result[1];
取得に続く更新のコード:
Query qry = entityManager.createNamedQuery("updateQry");
qry.setParameter(1, status);
qry.setParameter(2, entity.getId() );
qry.executeUpdate()
編集:
updateステートメントがなくても問題が発生します。単純な検索を行っても、OpenJPAは追加の更新クエリを実行しています。