繁体   English   中英

JPA从表单输入创建本机查询

[英]Jpa create native query from form input

通常在上班时间,我会花费大量时间查询db(oracle)并从存储接收到的流的各种表中解析blob。 流的类型多种多样,所以我试图制作一个简单的webapp,在其中编写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

我知道这种方法似乎很奇怪,但是我们的团队花费大量时间尝试对存储的流进行标记化(用于标识如何解析流的代码也存储在表中)。不用说这个应用程序将被使用仅在内部。有一种方法可以按原样执行查询并检索正确的输出?

好吧,我试图在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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM