如何从过程中获取DTO对象

时间:2017-06-09 15:00:06

标签: java spring-boot spring-data spring-data-jpa

我需要在我的sql server数据库上执行一个程序,该程序将返回一些字段,我希望直接在我将要返回的DTO对象的List中转换这些字段,但我是Spring的新手,可以不能让它发挥作用。我试图做一个转换器类,但不太了解它是如何工作的,因为它错了,这是我的代码,我希望它的工作方式:

public interface IMyDtoRepository extends JpaRepository<SomeEntity, Long> {

@Query(value = "EXECUTE MyProcedure :param1, :param2, :param3, :param4, :param5)")
public List<MyDtoObject> execMyProcedure(@Param(value = "param1") Integer param1,
        @Param(value = "param2") String param2,
        @Param(value = "param3") String param3,
        @Param(value = "param4") String param4,
        @Param(value = "param5") Integer param5);

}

DtoObject

public class MyDtoObject{

    // My Declared Fields...

    public MyDtoObject() {

    }

    public MyDtoObject(/* My Fields */) {
        // Setting fields
    }

    public MyDtoObject(Object[] objects) {
        // Setting fields
    }

    // Getters n Setters...

我省略了我认为没有必要的信息,但如果需要,我可以提供更多解释

2 个答案:

答案 0 :(得分:0)

我在DAL中使用了类似的方法。它使用反射和泛型将数据表转换为您传入的任何类型。只需传入您通过程序获得的数据表,然后就可以了。

public List<T> ConvertDataToTypeList<T>(System.Data.DataTable DataTable) where T : class, new()
    {
        try
        {
            System.Type t_Object_Type = typeof(T);
            ICollection<PropertyInfo> p_Properties;

            lock (Properties_Dictionary)
            {
                if (!Properties_Dictionary.TryGetValue(t_Object_Type, out p_Properties))
                {
                    p_Properties = t_Object_Type.GetProperties().Where(property => property.CanWrite).ToList();
                    Properties_Dictionary.Add(t_Object_Type, p_Properties);
                }
            }

            System.Collections.Generic.List<T> l_List = new List<T>(DataTable.Rows.Count);

            foreach (var v_Row in DataTable.AsEnumerable())
            {
                T o_Object = new T();

                foreach (var prop in p_Properties)
                {
                        var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                        var safeValue = v_Row[prop.Name] == null ? null : Convert.ChangeType(v_Row[prop.Name], propType);

                        prop.SetValue(o_Object, safeValue, null);
                }

                l_List.Add(o_Object);
            }

            return l_List;
        }
        catch
        {
            return new List<T>();
        }
    }

答案 1 :(得分:0)

使用spring-data-jpa将结果映射到DtoObject上:@SqlResultSetMapping

javadoc here