0

特定のプロパティに一致するすべてのオブジェクトを除外することにより、OQL (Object Query Language) でオブジェクトを選択する方法はありますか?

Categoryオブジェクトに再帰的にアクセスするには、ルート カテゴリを取得するだけです。後で、 を通じてその children-property にアクセスしますFetchType.EAGER

ここで、カテゴリを削除するとき、実際には削除しませんが、deleted-property を true に設定します。これは、変更/削除されたカテゴリでうまく機能しますが、children プロパティにアクセスすると、削除されたカテゴリ オブジェクトがまだ取得されます。

root-Category を取得するための現在の OQL-Select は次のようになります。

SELECT c FROM Category c WHERE c.name = 'Root'

を持つすべてのカテゴリオブジェクトを除外する方法はありますCategory.deleted = trueか? children-property 内で削除された真のカテゴリが見つからないように、再帰的に意味しますか?

エンティティは次のようになります。

@Entity
@NamedQueries({
    @NamedQuery(name = Category.FIND_CATEGORY_ROOT,
                query = "SELECT c FROM Category c WHERE c.name = 'Root'")
})
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    private static final String PREFIX = "Category.";
    public static final String FIND_CATEGORY_ROOT = PREFIX + "findCategoryRoot";
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private boolean deleted;
    @OneToMany(fetch = FetchType.EAGER)
    private List<Category> children;

    // More code here
}
4

1 に答える 1

0

オプションが必要だと思います:

  1. 名前付きクエリを追加c.name = 'Root' and c.deleted = false
  2. 名前付きクエリを使用しないでください。通常のクエリを使用して、entityManager.createNamedQueryそこにフィルタリングを追加してください。

JPA プロバイダーが休止状態の場合、アノテーション@Where(clause = 'c.deleted = false')を追加すると、すべてのクエリに追加されます。

于 2015-09-22T05:18:31.173 に答える