[英]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.