使用@ConstructorResult
將工作的偉大,一旦它適用於你的持久層。在此之前,有一個Hibernate特定的方法使用org.hibernate.SQLQuery
和org.hibernate.transform.ResultTransformer
,它不依賴於@SqlResultSetMapping
。因爲POJO被填充,所以Hibernate找不到@Entity
自動變成表格。
非持續POJO:
public class Foo {
public Long row_id;
public String name;
}
使用ResultTransformer:
public static class FooResultTransformer implements ResultTransformer {
@Override
public List transformList(List list) { return list; }
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
List<String> aliasList = Arrays.asList(aliases);
Foo foo = new Foo();
foo.row_id = ((Number) getValue(tuple, aliasList, "row_id", 0L))
.longValue();
foo.name = (String) getValue(tuple, aliasList, "name", null);
return foo;
}
private static Object getValue(Object[] tuple, List<String> aliases,
String field, Object defaultValue)
{
// unchecked for berevity
if (tuple[aliases.indexOf(field)] == null) {
return defaultValue;
}
return tuple[aliases.indexOf(field)];
}
}
SQLQuery對原住民:
String sql = "SELECT id AS row_id, friendlyName AS name FROM SomeTable";
Session session = JPA.em().unwrap(Session.class);
SQLQuery q = session.createSQLQuery(sql);
q.setResultTransformer(new FooResultTransformer());
List<Foo> fooList = q.list();
期待這一點;我將堅持一個適用於JPA 2.0或非beta版Hibernate的解決方案。 –