1

JPA / Hibernate+Springを使用してカテゴリベースのWebアプリケーション多言語を構築しています

私は現在、Category、CategoryLanguage、Languageの3つのBean/エンティティを作成しました。

カテゴリー:

@Entity
public class Category implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @ManyToOne
    private Category father;
    @OneToMany(mappedBy = "father")
    private List<Category> children;
    @OneToMany(mappedBy="category")
    private List<CategoryLanguage> categoryLanguages;

カテゴリ言語:

@Entity
public class CategoryLanguage implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @ManyToOne
    Category category;
    @Column(length = 20, nullable = false)
    private String name;
    @ManyToOne
    private Language language;

言語

public class Language implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(length=2)
    private String id; // en, de, fr, it, es,...
    
    @Column(length=25)
    private String name; // English, Deutsch, Français,...

電話で

from Category c join c.categoryLanguages cl where c.father = null and cl.language.id = :lang

適切な言語で最初のレベルのカテゴリを返しますが、子としてすべての言語が含まれています。

クエリで選択した言語ではなく、すべての言語の子が抽出されます。

この問題を解決するにはどうすればよいですか?JPQLで参加」できません。

4

2 に答える 2

1

クエリは完全なCategoryエンティティを要求しているため、JPAで厳密に必要なことを達成することはできません。JPAでは、返されるカテゴリエンティティがデータベース内のデータを反映している必要があります。これには、選択クエリで対応する可能性のある言語に関係なく、すべてのCategoryLanguagesが含まれます。

代わりに、クエリを別の方法で再配置することをお勧めします。この場合、目的の言語に関連付けられているCategoryLanguageエンティティをクエリし、それを使用してカテゴリを取得します。category-> CategoryLanguageリレーションは引き続き入力されますが、クエリは、他の言語を使用せずに、必要な言語を表すCategoryLanguageのみを返します。必要に応じて簡単にするために、これらをカテゴリ別にキー設定します。

ほとんどのプロバイダーは、マッピングに直接フィルタリング基準を追加することを許可しています。または、部分的なエンティティのみを返すクエリを使用することもできますが、そのルートをたどらないように注意してください。一度実行すると、アプリを維持してデータを正しく管理することが難しくなり、キャッシュなどのパフォーマンスオプションが制限される可能性があります。たとえば、すべての部分的なカテゴリエンティティがあり、新しいCategoryLanguageを追加したり、その他の変更を加えたりしたい場合、どのように処理しますか?データベースのリストにないCategoryLanguageが発生するため、マージは機能しません。

于 2012-10-19T17:29:39.937 に答える
0

必ず使用してくださいFetchType.EAGER

以下のように使用します:

SELECT c FROM Cagegory c INNER JOIN c.categoryLanguages l WHERE c.father = null AND l.id = :languageId

@OneToMany(mappedBy = "father", fetch = FetchType.EAGER)
private List<Category> children = new ArrayList();
@OneToMany(mappedBy="category", fetch = FetchType.EAGER)
private List<CategoryLanguage> categoryLanguages = new ArrayList();
于 2012-10-19T07:12:32.947 に答える