Как получить BLOB-объект с сервера с помощью репозитория JPA весной - PullRequest
0 голосов
/ 28 января 2019

Я создал весеннее приложение для CRUD.Я могу легко записывать в данные сервера, такие как string, Long, blob, но когда я пытаюсь получить их с сервера.Я с трудом столкнулся с тем, какой байтовый массив с сервера выдает BigInteger с сервера.Как я мог получить данные в байтовом массиве вместо BigInteger? Когда я пишу в байтовый массив вставки эти данные, столбец которых является BLOB.Вот мой код

Репозиторий

public interface ArriveRepository extends JpaRepository<ArriveEntity,Long>
{ 
    @Query(value = "select arrive.time,air_lines.image,arrive.flight,arrive.destination_uzb," +
            "arrive.destination_eng,arrive.destination_rus,arrive.status,arrive.status_time " +
            "from arrive inner join air_lines on air_lines.id = arrive.airline_id where arrive.arrive_date = (:date1)",nativeQuery = true)
    List<Object[]> getForArriveTerminal(@Param("date1") LocalDate date1);
}

Когда я получаю данные с сервера, я использую этот класс

ArriveTerminalDto

public class ArriveTerminalDto {
   private String time;
   private BigInteger logo;
   private String flight;
   private String destinationUzb;
   private String destinationEng;
   private String destinationRus;
   private String status;
   private String statusTime;
  //getter setter}

Класс обслуживания

  public List<ArriveTerminalDto> getToShow(LocalDate date1)
    {
        List<ArriveTerminalDto> list = new ArrayList<>();
        List<Object[]> list1 = arriveRepository.getForArriveTerminal(date1);
        for(Object[] objects: list1)
        {
            ArriveTerminalDto arriveTerminalDto = new ArriveTerminalDto();
            arriveTerminalDto.setTime((String)objects[0]);
            arriveTerminalDto.setLogo((BigInteger) objects[1]);
            arriveTerminalDto.setFlight((String) objects[2]);
            arriveTerminalDto.setDestinationUzb((String) objects[3]);
            arriveTerminalDto.setDestinationRus((String) objects[4]);
            arriveTerminalDto.setDestinationEng((String) objects[5]);
            arriveTerminalDto.setStatus((String) objects[6]);
            list.add(arriveTerminalDto);
        }
        return list;
    }

Этот код работает, но он не дал мне байтовый массив с сервера.Когда я пытаюсь изменить BigInteger на массив byt [], он выдает мне следующие ошибки от почтальона

{
    "timestamp": "2019-01-28T09:33:52.038+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "java.math.BigInteger cannot be cast to [B",
    "path": "/arrive/terminal/date=2019-01-27"
}

Изменен объект в ArriveTerminalDto, но все равно выдается ошибка моего следующего репо

public interface ArriveRepository extends JpaRepository<ArriveEntity,Long>
{

    @Query(value = "select arrive.time,air_lines.image,arrive.flight,arrive.destination_uzb," +
            "arrive.destination_eng,arrive.destination_rus,arrive.status,arrive.status_time " +
            "from arrive inner join air_lines on air_lines.id = arrive.airline_id where arrive.arrive_date = (:date1)",nativeQuery = true)
    List<ArriveTerminalDto> getForArriveTerminal(@Param("date1") LocalDate date1);
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Почему бы вам не взглянуть на проект сообщества Spring Content .Этот проект позволяет связать контент с сущностями Spring Data.Думайте Spring Data, но для Контента или неструктурированных данных.Это также может дать вам конечные точки REST для контента, например Spring Data REST.

Этот подход предоставит вам четкую абстракцию для вашего контента с реализациями для различных типов хранилищ.Он основан на потоке, а не на байтах.Использование byte [] не сработает, если вы хотите передавать очень большие файлы.Кроме того, получение баз данных для правильной потоковой передачи является очень своеобразным.Вы, вероятно, не хотите разбираться со всем этим самим, когда Spring Content уже имеет.

Это довольно легко добавить в ваши существующие проекты.Я не уверен, используете ли вы Spring Boot или нет.Я приведу пример загрузки без пружины:

pom.xml

   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-jpa</artifactId>
      <version>0.5.0</version>
   </dependency>
   <!-- REST API (if you want it) -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest</artifactId>
      <version>0.5.0</version>
   </dependency>

Конфигурация

@Configuration
@EnableJpaStores
@Import("org.springframework.content.rest.config.RestConfiguration.class")
public class ContentConfig {

    // schema management
    // 
    @Value("/org/springframework/content/jpa/schema-drop-mysql.sql")
    private Resource dropContentTables;

    @Value("/org/springframework/content/jpa/schema-mysql.sql")
    private Resource createContentTables;

    @Bean
    DataSourceInitializer datasourceInitializer() {
        ResourceDatabasePopulator databasePopulator =
                new ResourceDatabasePopulator();

        databasePopulator.addScript(dropContentTables);
        databasePopulator.addScript(createContentTables);
        databasePopulator.setIgnoreFailedDrops(true);

        DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource());
        initializer.setDatabasePopulator(databasePopulator);

        return initializer;
    }
}

Чтобы связать контент, добавьте аннотации Spring Content к своей учетной записи.

ArriveEntity.java

@Entity
public class ArriveEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    .. existing fields...    


    @ContentId
    private String contentId;

    @ContentLength
    private long contentLength = 0L;

    // if you have rest endpoints
    @MimeType
    private String mimeType = "text/plain";
}

Создайте "хранилище":

ArrivEntityContentStore.java

@StoreRestResource(path="arriveEntityContent)
public interface ArrivEntityContentStore extends ContentStore<ArriveEntity, String> {
}

Это все, что вам нужно для создания конечных точек REST @ /arriveEntityContent.Когда ваше приложение запускается, Spring Content проверит ваши зависимости (см. Spring Content JPA / REST), взглянет на ваш ArrivEntityContentStore интерфейс и внедрит реализацию этого интерфейса для JPA.Он также внедрит @Controller, который перенаправляет http-запросы в эту реализацию.Это избавляет вас от необходимости реализовывать все это самостоятельно, что, я думаю, то, что вы ищете.

Итак ...

Чтобы получить доступ к контенту с помощью API Java, автоматически подключите ArrivEntityContentStore и используйте его методы.

Или для доступа к контенту с помощью REST API:

curl -X POST /arriveEntityContent/{arriveEntityId}

с запросом multipart / form-data сохранит изображение в базе данных и свяжет его с объектом учетной записи, чей идентификатор равен itemId.

curl /arriveEntityContent/{arriveEntityId}

получит его снова и так далее ... поддерживает полный CRUD.

Есть несколько руководств по началу работы здесь .Справочное руководство - здесь .И здесь есть обучающее видео здесь .Кодовый бит начинается примерно на полпути.

HTH

0 голосов
/ 28 января 2019

Попробуйте изменить определение сущности для непосредственной обработки byte [], но предложите JPA интерпретировать его как Lob.Вы можете сделать это с помощью аннотации @Lob:

public class ArriveTerminalDto {
    private String time;
    @Lob
    private byte[] logo;
    private String flight;
    private String destinationUzb;
    private String destinationEng;
    private String destinationRus;
    private String status;
    private String statusTime;
}

Laster. Как подсказывает @Clijsters, вы можете изменить репо, чтобы получить List<ArriveTerminalDto>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...