从Object []映射到CustomObject。使用findBySQL查询

时间:2017-03-10 16:00:57

标签: java sql java-8 mapping java-stream

有一个简单的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]);
...

但我认为这种方法不是一个好的实现,因为它取决于返回的列的顺序,我必须为每个要设置的属性编码。

是否有任何方法可以将此 对象[] 映射到 通知

提前致谢并为糟糕的代码感到抱歉,但我没有更好的方法解决这个问题。

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());