Как преобразовать список <Object []> в список <SimpleAccount>в Java? - PullRequest
0 голосов
/ 01 июля 2019

Я использую JDK 12, Spring Boot 2.1.5.RELEASE, Spring Data JPA.Я следую руководству на https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting

У меня есть репозиторий

package com.example.repository;

import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.example.entity.Account;

import java.util.List;

@Repository
public interface AccountRepository extends JpaRepository<Account, Integer> {

    @Query("SELECT a.id, a.accountNumber, a.accountName FROM Account a WHERE a.grade = 2")
    List<Object[]> findAllAccount(Sort sort);

}

и

package com.example.dto;

public class SimpleAccount {

    private Integer id;
    private String accountNumber;
    private String accountName;

    public SimpleAccount() {

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

}

У сущности Account больше полей, чем у сущности SimpleAccount.

на контроллере

package com.example.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.example.common.UtilityList;
import com.example.dto.SimpleAccount;
import com.example.entity.Account;
import com.example.repository.AccountRepository;

import javax.servlet.http.HttpServletRequest;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

@Controller
public class AccountController {

    @Autowired
    AccountRepository accountRepository;

    @RequestMapping(value = "/accounts_mulcol_json", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String accountsMulColJSON() throws JsonProcessingException {
        List<Object[]> accountsList = accountRepository.findAllAccount(Sort.by("accountNumber"));
        List<SimpleAccount> simpleAccountList = new ArrayList<>();

Как преобразовать List<Object[]> в List<SimpleAccount>?

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Другое решение было бы написать конструктор для SimpleAccount класса, подобный этому:

public SimpleAccount(Object[] objects) {
    setId((Integer) objects[0]);
    setAccountNumber((String) objects[1]);
    setAccountName((String) objects[2]);
}

А затем сопоставьте List<Object[]> с List<SimpleAccount> следующим образом:

List<SimpleAccount> simpleAccountList = accountRepository.findAllAccount(Sort.by("accountNumber")).stream().map(SimpleAccount::new).collect(Collectors.toList());
1 голос
/ 01 июля 2019

Создать дополнительный конструктор для SimpleAccount

public SimpleAccount(Integer id, String accountNumber, String accountName) {
    ...
}

и определите свой @Query следующим образом:

@Query("SELECT new com.example.dto.SimpleAccount(a.id, a.accountNumber, a.accountName) FROM Account a WHERE a.grade = 2")
List<SimpleAccount> findAllAccount(Sort sort);

Если вам нужно вручную преобразовать List<Object[]> в List<SimpleAccount>, так что создайте заново новый конструктор

public SimpleAccount(Object[] data) {
    this.id = (Integer) data[0];
    this.accountNumber = (String) data[1];
    ...
}

Теперь, когда вы получите List<Object[]> из базы данных, переберите список и вызовите contstructor:

List<Object[]> accountsList = accountRepository.findAllAccount(Sort.by("accountNumber"));
List<SimpleAccount> simpleAccountList = new ArrayList<>();
for (Object[] obj: accountsList) {
    simpleAccountList.add(new SimpleAccount(obj));
}
0 голосов
/ 01 июля 2019

Просто верните аккаунт вместо объекта []

@Query("SELECT a FROM Account a WHERE a.grade = 2")
List<Account> findAllAccount(Sort sort);
...