5

私はjpa 2.0を使用しており、次のエンティティがあります:

@Entity
public class Folder{

    @ElementCollection
    @CollectionTable(name="folder_files")
    private Set<String> files;      
    // .....
 }

ファイル名を指定して、 files == theGivenFileNameであるすべてのエントリを削除したいと思います。SQL では、次のようになります。

Delete from folder_files where files = XXX

criteria-api を使用してこのクエリを実行する方法はありますか? そうでない場合、jpql を使用してこのクエリを実行する方法はありますか?

更新: 私の質問は十分に明確ではなかったと思います: jpql はエンティティ (テーブルではない) を使用するため、上記の sql を実行することはできません@ElementCollection。すべてのエンティティから、特定の値を保持するそのコレクション (私の場合はファイル セット) 内のすべてのエントリを削除したいと思います。jpqlまたは(さらに良い)基準APIを使用してそれは可能ですか?

4

3 に答える 3

1

これはできません。DELETEステートメントはエンティティにしか適用できないため、JPQL経由では機能しません。JPA 2.0 仕様からの抜粋:

一括更新および一括削除操作は、単一のエンティティ クラスのエンティティに適用されます (存在する場合は、そのサブクラスと共に)。
...
delete_statement ::= delete_clause [where_clause]
delete_clause ::= DELETE FROM entity_name [[AS] 識別変数]

また、Criteria API 経由では機能しません。CriteriaQueryは選択のみをサポートし、更新や削除はサポートしません。

ネイティブ SQL を使用する必要があります。

于 2012-07-20T10:52:43.437 に答える
1

構文がわずかに変更されただけで、 like クエリを使用できます。

query = em.createQuery("SELECT i FROM Item i WHERE UPPER(i.name) LIKE :keyword ");
query.setParameter("keyword", "%" + keyword.toUpperCase() + "%");

次のリンクで詳細を読むことができます。

https://forums.oracle.com/forums/thread.jspa?threadID=423742

更新しました:

@Noamあなたはそれを行うことができます:Criteria APIのように

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();

詳細については、次のリンクを参照してください。

http://ctpconsulting.github.com/query/1.0.0.Alpha3/criteria.html

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

于 2012-05-07T12:41:01.847 に答える