2017-08-15 7 views
1

通常、私の勤務時間中、私たちは受け取ったストリームが格納されているさまざまなテーブルからdb(oracle)とblobをクエリするのに多くの時間を費やします。 さまざまな種類のストリームがありますので、select文を記述する単純なwebappを作成しようとしていて、それに応じて解析されたストリームをすべて返します。Jpaフォーム入力からネイティブクエリを作成する

select B_BODY from TABLE_B where TRANSACTION_ID = 'GG-148c-01502790743907855009'; 

文はデータベースがレコードを返す直接問い合わせることが、何も返さない: 私の問題は、JPAを使用して、簡単なネイティブクエリを実行することです。 (

Hibernate: 
select 
    B_BODY 
from 
    TABLE_B 
where 
    TRANSACTION_ID ='GG-148c-01502790743907855009' 
    and rownum <= 100 

は、私はこの方法かもしれないが、奇妙なようだが、私たちのチームは保存されたストリームをトークン化しようとしている多くの時間を費やすことを知っている:これはSQLが生成され

@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;   
} 

: は、これは私のJavaコードでありますこのアプリケーションは、唯一のinternally.there使用されようとしていると言うこともテーブルに格納されているか、ストリームを解析するために識別コード).Uselessはちょうどそれがあるとして、クエリを実行し、正しい出力を取得する方法は何ですか?

+0

Webアプリケーションから直接クエリを実行しますか?これが示唆しているセキュリティリスクを考えましたか?あなたのDBAはそれについて何を言いますか? –

+0

私は私はすでにDBA(自分自身)に尋ねたと彼は同意し、すでにdb.Btwにクエリを実行することができ、人々から内部的に使用されようとしている言ったように。 –

答えて

0

まあ、私は正常に働いていたMariaDBにあなたの問題を再現してみました(mysqlのコネクタ-Javaに+休止状態)が、ネイティブクエリでロブを選択します。

あなたのBLOBを保持するエンティティを作成し、これが役立つかどうかを確認できます。私はあなたがLOB型をidentifingているかわからないが、それは通常のデータベースフィールドの場合、あなたはまた、自分のブロブを識別するために、適切なDiscriminatorValueで実体を作ることができます。ちょうどあなたのロブ列の上に@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; 

} 
関連する問題