是否可以将Hibernate ResultSetOutput映射到pojo

时间:2016-09-08 17:15:46

标签: hibernate

以下代码来自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寻找解决方案

1 个答案:

答案 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);