【问题标题】:Jpa create native query from form inputJpa 从表单输入创建本机查询
【发布时间】:2017-08-15 18:09:06
【问题描述】:

通常在我的工作时间内,我会花费大量时间查询 db(oracle) 并从存储我们接收到的流的各种表中解析 blob。 有各种类型的流,所以我试图制作一个简单的 web 应用程序,在其中编写 select 语句并返回相应解析的所有流。 我的问题是使用 jpa 并执行简单的本机查询:

select B_BODY from TABLE_B where TRANSACTION_ID = 'GG-148c-01502790743907855009';

该语句不返回任何内容,而是直接查询数据库返回记录。 这是我的java代码:

@Transactional(readOnly = true)
public List<Object[]> retrieveBlobs(String squery) {
    squery = squery + " and rownum <= "+maxResults;
    Query query = em.createNativeQuery(squery);
    List<Object[]> resultList = query.getResultList();
    return resultList;        
}

这是生成的sql:

Hibernate: 
select
    B_BODY 
from
    TABLE_B
where
    TRANSACTION_ID ='GG-148c-01502790743907855009' 
    and rownum <= 100

我知道这种方式可能看起来很奇怪,但我们的团队花了很多时间尝试标记存储的流(识别如何解析流的代码也存储在表中)。没用说这个应用程序正在运行只能在内部使用。有一种方法可以按原样执行查询并检索正确的输出?

【问题讨论】:

  • 直接从 webapp 执行查询?您是否考虑过这可能带来的安全风险?您的 DBA 对此有何看法?
  • 正如我所说,只会在已经可以在 db 上执行查询的人内部使用。顺便说一句,我已经向 dba(我自己)询问过,他同意了。

标签: java oracle hibernate jpa


【解决方案1】:

好吧,我尝试在 MariaDB 上重现您的问题(使用 mysql-connector-java + hibernate),但是选择带有本机查询的 lob 工作正常。

您可以尝试创建将持有您的 blob 的实体并检查这是否有帮助。只需在您的 lob 列上创建一个带有 @Lob 注释的标准实体。

@Entity
@NamedQueries(
        @NamedQuery(name = FIND_ALL, query = "SELECT m FROM LobEntity m")
)
public class LobEntity {

    public static final String FIND_ALL = "PhpEntity.findAll";
    @Id
    @Column(name = "id")
    private String id;

    @Lob
    @Column(name = "lob")
    private byte[] lob;

    //Use Blob class if you want to use streams.
    //@Column(name = "lob")
    //@Lob
    //private Blob lob;

}

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2014-11-11
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2016-11-02
    • 2012-10-09
    相关资源
    最近更新 更多