我需要在我的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...
我省略了我认为没有必要的信息,但如果需要,我可以提供更多解释
答案 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