以下代码来自hibernate docs
Session session = entityManager.unwrap(Session.class);
ProcedureCall call = session.createStoredProcedureCall( "sp_person_phones");
call.registerParameter(1, Long.class, ParameterMode.IN).bindValue(1L);
call.registerParameter(2, Class.class, ParameterMode.REF_CURSOR);
Output output = call.getOutputs().getCurrent();
List<Object[]> postComments = ( (ResultSetOutput) output ).getResultList();
assertEquals(2, postComments.size());
是否可以通过指定映射将对象转换为pojo。
我知道可以使用JPA和@SqlResultSetMapping但是使用Hibernate API寻找解决方案
答案 0 :(得分:1)
我是通过手动映射完成的。
@Retention(RetentionPolicy.RUNTIME)
public @interface ColumnIndex {
int value();
}
然后使用注释指定要映射的数组索引
@ColumnIndex(value = 4)
private Date eventDate;
还创建了一个util方法来为任何对象进行映射
public static <T> List<T> createBeanList(List<Object[]> propertyValues, Class<T> clazz) {
List<T> list = new ArrayList<T>();
for (Object[] singleObjectProperties : propertyValues) {
T object;
try {
object = clazz.newInstance();
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
int fieldIndex = field.getAnnotation(ColumnIndex.class).value();
set(object, field.getName(), singleObjectProperties[fieldIndex]);
}
} catch (Exception e) {
object = null;
}
list.add(object);
}
return list;
}
private static void set(Object object, String fieldName, Object fieldValue) {
Class<?> clazz = object.getClass();
try {
if (fieldValue != null) {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, fieldValue);
}
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
调用实用程序方法
List<TCalendar> calendars = ArrayToBeanPropertiesUtil.createBeanList(arrayListResult,
TCalendar.class);