[英]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.