2017-08-15 56 views
1

創建本機查詢通常在我的工作時間,我花了很多時間查詢db(oracle)並從存儲我們接收的流的各個表中解析blob。 有各種類型的流,所以我試圖做一個簡單的Web應用程序,我寫的選擇語句,它會返回所有相應的解析流。 我的問題是使用JPA和執行簡單的本地查詢: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

直接從webapp執行查詢?您是否考慮過這可能意味着的安全風險?你的DBA對此有何評論? –

+0

正如我所說的將被內部使用,只能從那些已經可以對db.Btw執行查詢的人使用,我已經問過dba(我),他同意。 –

回答

0

嗯,我試圖在MariaDB上重現你的問題(使用mysql-connector-java + hibernate),但選擇一個帶本地查詢的lob是正確的。

你可以嘗試創建將持有你的blob實體,並檢查這是否會有所幫助。我不知道你如何識別lob類型,但是如果它是一個正常的數據庫字段,你也可以使用正確的DiscriminatorValue來創建實體,以便識別你的blob。只需在您的高球欄中添加@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; 

}