有一个简单的SQL表,如:
NOTIFICATION (ID, NAME, NOTIF_DATE, ...)
我使用以下代码从我的后端应用程序中执行SQL查询:
this.findBySQL(MY_SQL_QUERY, params...);
SQL SELECT QUERY正确执行并返回预期的行。我面临的问题是返回的行被包装到 Object [] ,但在此查询之后,我想使用 Java过滤结果8流和过滤功能 。
我希望将结果映射到我的自定义对象通知,如下所示:
Notification { long id, String name, Date notif_date, ... }
我可以创建自己的映射器,从查询中获取 Object 的结果值,例如:
Notification not = new Notification();
not.setName(obj[1]);
...
但我认为这种方法不是一个好的实现,因为它取决于返回的列的顺序,我必须为每个要设置的属性编码。
是否有任何方法可以将此 对象[] 映射到 通知 ?
提前致谢并为糟糕的代码感到抱歉,但我没有更好的方法解决这个问题。
答案 0 :(得分:2)
如果你的Notification
类有一个接受数据库中字段的构造函数(或者你可以添加这样的构造函数),这是最简单的:
List<Object[]> rows = this.findBySQL(MY_SQL_QUERY, params);
List<Notification> notifs = rows.stream()
.map(r -> new Notification((Long) r[0], (String) r[1], (Date) r[2]))
.filter(n -> n.getName().startsWith("m"))
.collect(Collectors.toList());
你没有告诉我们findBySQL()
的确切返回类型,所以我猜了一下。我希望您能够根据您的具体情况定制代码。
为了示例,我在流中输入了一个相当无意义的filter()
。在创建Notification
对象后,我会发现过滤更方便。如果您愿意,也可以先过滤。我真的不明白你为什么不在SQL中进行过滤。
如果你不能为此目的添加一个好的构造函数,它会更长一点,但实际上并不复杂:
List<Notification> notifs = rows.stream()
.map(r -> {
Notification notif = new Notification();
notif.setId((Long) r[0]);
notif.setName((String) r[1]);
notif.setNotif_date((Date) r[2]);
return notif;
})
.filter(n -> n.getName().startsWith("m"))
.collect(Collectors.toList());