2013-08-30 2 views
0

Я следующая схема:Критерии с присоединением прекрасны ... но если я хочу добавить условие?

TABLE EMPLOYEE   TABLE COUNTRY 
---------------   --------------- 
id     |------> id 
name    |  country_name 
country_id ------|  country_code 

Если я хочу, чтобы получить список всех сотрудников, принадлежащих стране, я использую критерии, как это:

Criteria crit = getSession().createCriteria(Employee.class); 
crit.add(Restrictions.eq("country.id", countryId)); 
List<Employee> employees = crit.list(); 

Мой сотрудник объект относится к стране в этом путь:

@Entity 
public class Employee { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name="country_id") 
    private Country country; 

    // Other stuff here 
} 

Все здесь прекрасно работает!

Проблема в том, что я не знаю countryId, но вместо этого у меня есть country_code (например, «UK»). Как изменить приведенные выше критерии, чтобы я мог присоединиться к таблицам и добавить ограничение на код страны?

+0

Вы можете использовать, если еще от значений (то есть, если пробел) и включают в себя crit.add (Restrictions.eq ("country.id", countryId)) внутри блока, в зависимости от результата условия. – Davos555

ответ

0
 Criteria criteria = getSession().createCriteria(Employee.class,"e"); 
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
    criteria.createAlias("e.country", "c");   
    Criterion codeId= Restrictions.eq("c.id", yourCountryId); 
    Criterion codeCriterion= Restrictions.eq("c.countryCode", yourCountryCode); 
    criteria.add(Restrictions.or(codeId, codeCriterion)); 

    List<Employee> employees = criteria.list(); 

ИЛИ

Criteria criteria = getSession().createCriteria(Employee.class); 
    Criterion codeId = Restrictions.eq("country.id", yourCountryId); 
    Criterion codeCriterion = Restrictions.eq("country.countryCode", yourCountryCode); 
    criteria.add(Restrictions.or(codeId, codeCriterion)); 

    List<Employee> employees = crit.list() 
+0

обновил ответ – Prabhakaran

0

Вы можете сделать таким образом, простое дополнение, если еще

Criteria crit = getSession().createCriteria(Employee.class); 

if(StringUtils.isNotBlank(countryId)) 
    crit.add(Restrictions.eq("country.id", countryId)); 
else 
    crit.add(Restrictions.eq("country.code", countryCode)); 

List<Employee> employees = crit.list(); 
Смежные вопросы