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