简体   繁体   English

如何将结果集映射到映射器类中的复合对象

[英]How to map resultset into composite object in mapper class

I have query which will return 8 columns for order placement POC, First 4 will be same for few rows(person details) and remaining 4 alone will differ(order details).我有查询将返回 8 列用于订单放置 POC,前 4 行对于几行(人员详细信息)是相同的,剩下的 4 行会有所不同(订单详细信息)。 Its a non normalized table.它是一个非标准化表。

COL1   COL2   COL3   COL4   COL5  COL6  COL7  COL8
-----------------------------------------------------
a      aaa    bbb    ccc    ddd   eee   fff   ggg
a      aaa    bbb    ccc    hhh   iii   jjj   kkk

My object looks like我的对象看起来像

class OrderBook{
   int id;
   int name;
   String age;
   String mailId;
   List<Order> orderList;
}

class Order{
   String productName;
   int price;
   int quantity;
   String address;
}

how can i loop through the result set and map the rows into the Orderbook object.我如何遍历结果集并将行映射到 Orderbook 对象中。 Response should look something like below响应应如下所示

{
   "id": 1,
   "name": "dude",
   "age" : 22,
   "mailId": "dude@abc.com",
   "orderList": [
        {
            "productName": "Milk",
            "price":23,
            "quantity":2,
            "address": "dude, 1st street"
        },
        {
            "productName": "Egg",
            "price":5,
            "quantity":10,
            "address": "dude, 1st street"
        }
    ]
}

I dont know how to loop it here我不知道如何在这里循环

while(rs.next()){
    ???
}

If you are using ResultSet directly you have to implement transformers directly from RS to Object instance.如果您直接使用 ResultSet,则必须直接实现从 RS 到 Object 实例的转换器。 And use it from your DAO layer Something like:并从您的DAO层使用它,例如:

@Override
public User getByID(int id) {
    OrderBook book = new OrderBook();
    try {
        PreparedStatement select = OrderBookTransformer.getInstance().getSelectStatementById(id);
        ResultSet rs = select.executeQuery();
        while (rs.next()) {
            book = OrderBookTransformer.getInstance().fromRsToObject(rs);
        }
    } catch (SQLException e) {
        log.error(e);
    }
    return book;
}

Where OrderBookTransformer could be like: OrderBookTransformer可能是这样的:

@Override
public OrderBook fromRsToObject(ResultSet rs) {
    OrderBook book = new OrderBook();
    try {
        user.setId(rs.getInt("id"));
        user.setName(rs.getInt("name"));
        user.setAge(rs.getString("age"));
        // set other fields
    } catch (SQLException e) {
        log.error(e);
    }
    return user;
}

For the initialisation transformer I used the Singleton pattern:对于初始化转换器,我使用了单例模式:

public class OrderBookTransformer implements BaseTranformer<OrderBook> {

    private static final Logger log = Logger.getLogger(OrderBookTransformer.class);
    private static OrderBookTransformer instance = null;

    protected OrderBookTransformer() {
    }

    public static OrderBookTransformer getInstance() {
        if (instance == null) {
            instance = new OrderBookTransformer();
        }
        return instance;
    }

And select statement something like:并选择语句类似于:

@Override
public PreparedStatement getSelectStatementById(int id) {
    PreparedStatement select = null;
    try (Connection connection = ConnectionManager.getConnection()) {
        select = connection
                .prepareStatement("SELECT FROM order_books WHERE id = ?");
        select.setInt(1, id);
    } catch (SQLException e) {
        log.error(e);
    }
    return select;
}

My suggestion will be to use Spring Data instead of processing the Result Set directly.我的建议是使用Spring Data而不是直接处理结果集。

You will need to do just a few more steps:您只需再执行几个步骤:

  • add spring data dependency to your build toolspring data依赖项添加到您的构建工具
  • add JPA annotations to your model with relations to it:将 JPA 注释添加到您的模型中,并与它建立关系:
    @Entity
    class OrderBook {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Integer id;
       private Integer name;
       private String age;
       private String mailId;
    
       @ElementCollection(targetClass = Order.class, fetch = FetchType.EAGER)
        @CollectionTable(name = "orders", joinColumns = @JoinColumn(name = "book_id"))
       private List<Order> orderList;
       // no args constructor + getters/setters
    }
    
    @Entity
    class Order {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private String productName;
       private Integer price; // consider use Double here
       private Integer quantity;
       private String address;
    }
  • create a repository for this class:为这个类创建一个存储库:

public OrderBookRepository implements JpaRepository<OrderBook, Integer> {}公共 OrderBookRepository 实现 JpaRepository<OrderBook, Integer> {}

and use it for retrieving data from DB.并将其用于从数据库检索数据。

You should convert resultset to DataObject (OrderBook) firstly.您应该首先将结果集转换为 DataObject (OrderBook)。

List<OrderBook> list = new ArrayList<>();
while(rs.next()){
   OrderBook orderBook = mapToOrderBook(rs);
   list.add(orderBook);
}

Few basic functions which you should write.您应该编写的几个基本函数。

private List<OrderBook> getOrderBooks();
private OrderBook mapToOrderBook(ResultSet rs);

If you don't know how to get data from resultset:如果您不知道如何从结果集中获取数据:

https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

Then you can use jackson to convert List to json data.然后就可以使用jackson 将List 转换为json 数据。 Spring mvc already handled it for you. Spring mvc 已经为你处理好了。

@RequestMapping("/orderbooks")
public List<OrderBook> getOrderBooks() {
  return orderbookService.getOrderBooks();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM