我正在尝试以下操作,这导致了额外的更新执行,并使我的测试失败。
我有一个这样的实体。
@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()
编辑:
即使没有更新声明,我也看到了问题。OpenJPA是
执行额外的更新查询,即使我做了一个简单的查找。