Spring JPA @query 图片
Spring JPA @query image
我需要使用存储库中的自定义查询将图像保存在 postgresql 数据库中。
目前我将图像保存到数据库中作为 byte[] 与 mime 类型、文件名,并在同一行中创建 2 个缩略图图像。
对于 Http GET 请求,我需要显示图像,但我需要创建一个 qustom 查询,这样如果我想获取原始图像,我会查询它并且不加载存储在相同 table 数据库中的行。
我的文件实体:
@Entity
private String name;
private String mimeType;
private byte[] content;
private byte[] thumbnailSm;
private byte[] thumbnailMd;
// getters & setters
存储库:
@Component
public interface MyFileRepository extends JpaRepository<MyFile, Long> {}
目前我在控制器中从数据库中获取图像所做的工作:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public void getFile(@PathVariable Long id, HttpServletResponse response) throws IOException{
MyFile myFile = myFileRepository.findOne(id);
response.setContentType(myFile.getMimetype());
response.getOutputStream().write(myFile.getContent());
response.getOutputStream().close();
}
问题是当我只需要原始图像时,它会从数据库加载所有内容(缩略图、名称等)。
我尝试在存储库中创建自定义查询,我尝试使用的 sql 语句是:
@Query(value = "SELECT content FROM file WHERE id=:id")
也试过这个说法,不知道有什么区别:
@Query(value = "SELECT f.content FROM file f WHERE f.id=:id")
我从数据库中获取字节,但我似乎无法弄清楚如何将它们从存储库接口方法发送到控制器,以便我可以显示图像。
我尝试使用类似的东西:
byte[] findFileById(@Param("id") Long id);
和:
ResponseEntity<byte[]> findFileById(@Param("id") Long id);
所以我的问题是,在 sql 查询从数据库中获取图像的字节后,我如何创建一个 sql 查询方法来仅从数据库中获取图像而不加载其他内容(缩略图,姓名等)?
对不起,如果我的解释令人困惑。
获取实体时,所有属性也将被加载。您可以将列的提取策略设置为 FetchType.LAZY
,在这种情况下,实体属性在首次访问时使用辅助 select 语句加载。
勾选这个The best way to lazy load entity attributes using JPA and Hibernate
通过执行 sql 查询并将我不想加载的字段设置为 null,让它按我想要的方式工作:
@Query(value = "SELECT id, name, mime_type, content, null as thumbnail_sm, null as thumbnail_md FROM file WHERE id=:id", nativeQuery = true)
MyFile findContentById(@Param("id")Long id);
我需要使用存储库中的自定义查询将图像保存在 postgresql 数据库中。 目前我将图像保存到数据库中作为 byte[] 与 mime 类型、文件名,并在同一行中创建 2 个缩略图图像。 对于 Http GET 请求,我需要显示图像,但我需要创建一个 qustom 查询,这样如果我想获取原始图像,我会查询它并且不加载存储在相同 table 数据库中的行。
我的文件实体:
@Entity
private String name;
private String mimeType;
private byte[] content;
private byte[] thumbnailSm;
private byte[] thumbnailMd;
// getters & setters
存储库:
@Component
public interface MyFileRepository extends JpaRepository<MyFile, Long> {}
目前我在控制器中从数据库中获取图像所做的工作:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public void getFile(@PathVariable Long id, HttpServletResponse response) throws IOException{
MyFile myFile = myFileRepository.findOne(id);
response.setContentType(myFile.getMimetype());
response.getOutputStream().write(myFile.getContent());
response.getOutputStream().close();
}
问题是当我只需要原始图像时,它会从数据库加载所有内容(缩略图、名称等)。
我尝试在存储库中创建自定义查询,我尝试使用的 sql 语句是:
@Query(value = "SELECT content FROM file WHERE id=:id")
也试过这个说法,不知道有什么区别:
@Query(value = "SELECT f.content FROM file f WHERE f.id=:id")
我从数据库中获取字节,但我似乎无法弄清楚如何将它们从存储库接口方法发送到控制器,以便我可以显示图像。 我尝试使用类似的东西:
byte[] findFileById(@Param("id") Long id);
和:
ResponseEntity<byte[]> findFileById(@Param("id") Long id);
所以我的问题是,在 sql 查询从数据库中获取图像的字节后,我如何创建一个 sql 查询方法来仅从数据库中获取图像而不加载其他内容(缩略图,姓名等)? 对不起,如果我的解释令人困惑。
获取实体时,所有属性也将被加载。您可以将列的提取策略设置为 FetchType.LAZY
,在这种情况下,实体属性在首次访问时使用辅助 select 语句加载。
勾选这个The best way to lazy load entity attributes using JPA and Hibernate
通过执行 sql 查询并将我不想加载的字段设置为 null,让它按我想要的方式工作:
@Query(value = "SELECT id, name, mime_type, content, null as thumbnail_sm, null as thumbnail_md FROM file WHERE id=:id", nativeQuery = true)
MyFile findContentById(@Param("id")Long id);