【问题标题】:Map from Object[] to CustomObject. Using findBySQL query从 Object[] 映射到自定义对象。使用 findBy SQL 查询
【发布时间】:2017-08-01 01:14:26
【问题描述】:

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

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

有没有办法从这个 Object[] 映射到我的 Notification

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

【问题讨论】:

  • 嗯,你应该知道返回列的顺序,所以这应该不是问题。
  • 列顺序依赖性(如果存在)是您的 findBySQL() 方法的一个特征。如果您无法可靠地预测您从中收到的Object[] 元素的顺序和含义,那么当您收到该表单中的数据时,您已经迷失了方向。如果您可以预测列顺序,那么我看不出问题出在哪里。
  • 是的,我可以预测顺序,但我仍然需要设置我的 Noitification 的每个属性。

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


【解决方案1】:

如果你的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());

【讨论】:

  • 您可以先调用filter(r -&gt; ((String) r[1]).startsWith("m")),然后再创建Notification 对象。这样,您将创建更少的对象,从而减少开销(取决于您期望的结果数量)。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2020-04-02
  • 2012-04-28
  • 2019-05-23
相关资源
最近更新 更多