Java 从对象[]映射到CustomObject。使用findBySQL查询

Java 从对象[]映射到CustomObject。使用findBySQL查询,java,sql,java-8,mapping,java-stream,Java,Sql,Java 8,Mapping,Java Stream,有一个简单的SQL表,如: NOTIFICATION (ID, NAME, NOTIF_DATE, ...) 我正在使用以下代码从后端应用程序执行SQL查询: this.findBySQL(MY_SQL_QUERY, params...); SQL SELECT查询已正确执行并返回所需的行。我面临的问题是返回的行被包装到对象[],但是在这个查询之后,我想使用Java 8流和过滤功能过滤结果 我希望结果映射到我的自定义对象通知,如下所示: Notification{long id,Stri

有一个简单的SQL表,如:

NOTIFICATION (ID, NAME, NOTIF_DATE, ...)

我正在使用以下代码从后端应用程序执行SQL查询:

this.findBySQL(MY_SQL_QUERY, params...);

SQL SELECT查询已正确执行并返回所需的行。我面临的问题是返回的行被包装到对象[],但是在这个查询之后,我想使用Java 8流和过滤功能过滤结果

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

Notification{long id,String name,Date notif_Date,…}

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

Notification not = new Notification();
not.setName(obj[1]);
...
但是我认为这种方法不是一个好的实现,因为它取决于返回的列的顺序,并且我必须为每个要设置的属性编写代码

有没有办法将此对象[]映射到我的通知


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

如果您的
通知
类有一个从数据库接受字段的构造函数(或者您可以添加这样的构造函数),这是最简单的:


如果您的
通知
类有一个从数据库接受字段的构造函数(或者您可以添加这样的构造函数),则最简单的方法是:


嗯,您应该知道返回列的顺序,这样就不会有问题了。列顺序依赖性(如果存在)是
findBySQL()
方法的一个特征。如果您无法可靠地预测从对象[]接收到的
对象元素的顺序和意义,那么当您接收到该形式的数据时,您已经丢失了。如果您可以预测列顺序,那么我看不出问题出在哪里。是的,我可以预测顺序,但我仍然需要设置我的Noitification的每个属性。好的,您应该知道返回列的顺序,所以这不应该是一个问题。列顺序依赖性(如果存在)是
findBySQL()的一个特征
方法。如果您无法可靠地预测从对象[]
接收到的
对象元素的顺序和意义,那么当您接收到该形式的数据时,您已经丢失了。如果您可以预测列顺序,那么我看不出问题出在哪里。是的,我可以预测顺序,但我仍然需要设置我的Noitification的每个属性。您可以在创建
通知
对象之前,首先调用
过滤器(r->((String)r[1]).startsWith(“m”)
。这样,您可以创建更少的对象,从而减少开销(取决于预期的结果数量)。您可以在创建
通知
对象之前,首先调用
过滤器(r->((String)r[1]).startsWith(“m”)
。这样,您将创建更少的对象,减少开销(取决于您期望的结果数量)。
    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());
    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());