簡體   English   中英

如何在春季使用JPA存儲庫從服務器檢索Blob

[英]How to retrieve blob from server using JPA repository in spring

我已經為CRUD創建了Spring應用程序。 我可以輕松地寫入服務器數據,例如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);
}

嘗試更改實體定義以直接處理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;
}

最后,如@Clijsters所建議,您可以更改您的存儲庫以返回List<ArriveTerminalDto>

您為什么不看一下Spring Content社區項目。 該項目允許您將內容與Spring Data實體相關聯。 考慮Spring數據,但考慮內容或非結構化數據。 這也可以為您提供內容的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將查看您的依賴項(請ArrivEntityContentStore Spring Content JPA / REST),查看您的ArrivEntityContentStore接口,並為JPA注入該接口的實現。 它還將注入一個@Controller ,將@http請求轉發到該實現。 這省去了您必須自己實現的任何事情,我認為這是您的追求。

所以...

要使用Java API訪問內容,請自動ArrivEntityContentStore並使用它的方法。

或使用REST API訪問內容:

curl -X POST /arriveEntityContent/{arriveEntityId}

帶有multipart / form-data請求的請求會將圖像存儲在數據庫中,並將其與ID為itemId的帳戶實體相關聯。

curl /arriveEntityContent/{arriveEntityId}

將再次獲取它,依此類推...支持完整的CRUD。

有一對夫婦快速入門指南的在這里 參考指南在這里 而且還有視頻教程在這里 編碼位大約從1/2開始。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM