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

时间:2017-08-15 18:09:06

标签: java oracle hibernate jpa

通常在我的工作时间里,我花了很多时间查询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

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

1 个答案:

答案 0 :(得分:0)

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

}