java - 从 Object[] 映射到自定义对象。使用 findBy SQL 查询

标签 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 流和过滤功能

我希望将结果映射到我的自定义对象通知,如下所示:

通知 { 长 id, 字符串名称, 日期 notif_date, ... }

我可以创建自己的映射器,从查询中获得的对象获取结果值,例如:

Notification not = new Notification();
not.setName(obj[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());

关于java - 从 Object[] 映射到自定义对象。使用 findBy SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42722678/

相关文章:

java - 具有嵌套在不同实体类中的 Id 的实体类

java - 获取完整的 HTTP 请求

java - 保存从基类派生的实例

java - 意外的 BigDecimal 结果。 1 除以 3 结果为 1。不确定为什么

java - 准备好的语句中的异常

Java 8 : preferred way to count iterations of a lambda?

SQL Server 链接服务器加入

sql - 查找任何 3 个公共(public)属性的重复记录

openshift - OpenShift的DIY盒支持JDK 8

java - 从服务中获取错误的输出