2017-02-17 13 views
0
class Category{ 

    @Id 
    @Column(name="ID") 
    private Integer id; 
    private String name; 

    @OneToMany 
    @JoinColumn(name="CATEGORY_ID",referencedColumnName="ID") 
    private Set<Item> items; 

} 

class Item{ 

    private Integer id; 

    @Column(name="CATEGORY_ID") 
    private Integer categoryId; 

    private String name; 

    private String color; 
} 

Здесь у меня есть два субъекта (категория & Item), который имеет один ко многим.Как применять ограничение на обоих соединяемых лиц в спящий режим

Я попытался получить предметы, которые находятся под категорией id = 5 и цветом item = red. Я хотел бы, чтобы результат что-то вроде

{идентификатор: 5, название: 'фрукты' элементы: [{ID: 3, название: "помидор", цвет: красный}, {ID: 55 , название: "яблоко", цвета: "красное"}]}

Criteria c=session.createCriteria("Category.class","cat"); 
c.createAlias("cat.items","it"); 
c.add(Restrictions.eq("cat.id,5)); 
c.add(Restrictions.eq("it.color","red")); 

List<Category> cateList=c.list(); 

Однако я получаю все элементы в категории ид = 5; Wasted много time.Need Help.Thanks

Category    
ID NAME   
1 Flower  
5 Fruit  


Item    
ID CATEGORY_ID NAME COLOR 
3 5   tomato red 
55 5   apple red 
4 5   banana yellow 
6 5   orange orange 
7 5   grape green 
1 1   rose red 
2 1   rose yellow 
+0

Просьба поделиться последними данными в таблице – Akshay

ответ

1

Я хотел бы взглянуть на Hibernate @Filter и @FilterDef аннотациями.

Что вы в основном хотите сделать, так это определить фильтр, который применяет предикат цвета к записям в коллекции, когда они будут извлечены, чтобы в коллекции были только те, которые применимы.

@Entity 
public class Category { 
    @OneToMany 
    @Filter(name = "itemsByColor") 
    private Set<Item> items; 
} 

@Entity 
@FilterDef(name = "itemsByColor", 
    defaultCondition = "color = :color", 
    parameters = { @ParamDef(name = "color", type = String.class) }) 
public class Item { 
    private String color; 
} 

Что вам нужно сделать, это включить этот фильтр перед выполнением вашего запроса:

session.enableFilter("itemsByColor") 
     .setParameter("color", "red"); 

Теперь выполним Ваш запрос:

Criteria c=session.createCriteria("Category.class","cat"); 
c.createAlias("cat.items","it"); 
c.add(Restrictions.eq("cat.id,5)); 
c.add(Restrictions.eq("it.color","red")); 
List<Category> cateList=c.list(); 

Ваши Category экземпляры возвращаемые теперь должны содержать только Item сек которые имеют цвет red.

Помните, что когда фильтр включен, он остается в силе в течение всего сеанса.

Иногда полезно включить фильтр специально для одного запроса, подобного этому, и немедленно отключить его после того, как результаты были получены, чтобы избежать неправильных результатов других запросов по сравнению с Category.

 Смежные вопросы

  • Нет связанных вопросов^_^