2016-03-20 14 views
2

Ich habe 2 Entitäten mit @Where Annotation. Der erste ist Kategorie;@Where-Klausel funktioniert nicht innerhalb Hibernate Join-Abfrage

@Where(clause = "DELETED = '0'") 
public class Category extends AbstractEntity 

und es hat die folgende Beziehung;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category") 
private Set<SubCategory> subCategories = Sets.newHashSet(); 

und zweite Entität ist SubCategory;

@Where(clause = "DELETED = '0'") 
public class SubCategory extends AbstractEntity 

und enthält entsprechende Beziehung;

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "CATEGORY_ID") 
private Category category; 

Immer wenn ich die folgende Dao Methode nenne;

@Query(value = "select distinct category from Category category join fetch category.subCategories subcategories") 
public List<Category> findAllCategories(); 

Ich habe die folgende SQL-Abfrage erhalten;

select 
     distinct category0_.id as id1_3_0_, 
     subcategor1_.id as id1_16_1_, 
     category0_.create_time as create2_3_0_, 
     category0_.create_user as create3_3_0_, 
     category0_.create_userip as create4_3_0_, 
     category0_.deleted as deleted5_3_0_, 
     category0_.update_time as update6_3_0_, 
     category0_.update_user as update7_3_0_, 
     category0_.update_userip as update8_3_0_, 
     category0_.version as version9_3_0_, 
     category0_.name as name10_3_0_, 
     subcategor1_.create_time as create2_16_1_, 
     subcategor1_.create_user as create3_16_1_, 
     subcategor1_.create_userip as create4_16_1_, 
     subcategor1_.deleted as deleted5_16_1_, 
     subcategor1_.update_time as update6_16_1_, 
     subcategor1_.update_user as update7_16_1_, 
     subcategor1_.update_userip as update8_16_1_, 
     subcategor1_.version as version9_16_1_, 
     subcategor1_.category_id as categor11_16_1_, 
     subcategor1_.name as name10_16_1_, 
     subcategor1_.category_id as categor11_3_0__, 
     subcategor1_.id as id1_16_0__ 
    from 
     PUBLIC.t_category category0_ 
    inner join 
     PUBLIC.t_sub_category subcategor1_ 
      on category0_.id=subcategor1_.category_id 
    where 
     (
      category0_.DELETED = '0' 
     ) 

Könnten Sie mir bitte sagen, warum die obige Abfrage

und subcategor1_.DELETED = fehlt '0'

innen, wo Block?

Antwort

0

Dies ist eine schnelle Antwort;

Where wird bei einer direkten Abfrage für SubCategory wirksam. Um nicht gelöscht Unterkategorien erhalten verwenden Hibernate Filters als exampled auf here

2

Ich habe gerade ein ähnliches Problem in meinem Projekt gelöst.

Es ist möglich, @Where Annotation nicht nur auf Entity, sondern auch auf Ihre Child-Sammlung zu setzen.

Nach den javadoc:

Where-Klausel auf das Element Entity hinzuzufügen oder Einheit aus einer Sammlung

In Ihrem Fall Ziel wäre es, wie:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category") 
@Where(clause = "DELETED = '0'") 
private Set<SubCategory> subCategories = Sets.newHashSet(); 

Finden Sie eine ähnliche Probleme gelöst here

Ich glaube also Lösung ist nicht so invasiv im Vergleich zur Verwendung Hibernate Filters.Diese Filter sind standardmäßig deaktiviert und arbeiten auf Session-Ebene, so dass sie jedes Mal, wenn neue Sitzung öffnet zusätzliche Arbeit, vor allem, wenn Ihre DAO arbeitet Abstraktionen wie Spring Daten