【问题标题】:Spring JPA @query imageSpring JPA @query 图像
【发布时间】:2017-11-08 09:04:06
【问题描述】:

我需要使用存储库中的自定义查询将图像保存在 postgresql 数据库中。 目前,我将图像保存为具有 mime 类型、文件名的 byte[] 并在同一行中创建 2 个缩略图图像。 对于 Http GET 请求,我需要显示图像,但我需要创建一个 qustom 查询,以便如果我想获取原始图像,我会查询该图像并且不加载存储在数据库中同一表行中的缩略图或文件名.

MyFile 实体:

@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> {}

目前我在控制器中从 db 获取图像的操作:

    @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 查询从 db 获取图像的字节后,我如何创建一个 sql 查询方法来仅从 db 获取图像而不加载其他内容(缩略图、名称等)? 对不起,如果我的解释令人困惑。

【问题讨论】:

    标签: spring postgresql hibernate spring-data-jpa jpql


    【解决方案1】:

    通过执行 sql 查询并将我不想加载的字段设置为空,让它像我想要的那样工作:

    @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);
    

    【讨论】:

      【解决方案2】:

      在获取实体时,所有属性也将被加载。您可以将列的获取策略设置为FetchType.LAZY,在这种情况下,实体属性在第一次访问时会加载辅助选择语句。

      查看The best way to lazy load entity attributes using JPA and Hibernate

      【讨论】:

      • 我试过了,但不幸的是它不起作用。在我将“FetchType.LAZY”添加到列后休眠进行的 sql 查询:选择 myfile0_.id 作为 id1_0_0_,myfile0_.content 作为 content4_0_0_,myfile0_.mime_type 作为 mime_typ5_0_0_,myfile0_.name 作为 name6_0_0_,myfile0_.thumbnail_md 作为 thumbnai7_0_0_,myfile0_。 thumbnail_sm 作为 thumbnai8_0_0_ 来自文件 myfile0_ where myfile0_.id=?我在 repo 中有正确的 SQL 查询语句,我只需要弄清楚如何获得 byte[] 响应。 Jpa repo 支持 byte(原始类型),但不支持 byte[]。
      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2014-08-31
      相关资源
      最近更新 更多