使用@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的解决方案。 –