Критерии гибернации: поиск по содержимому в списке свойств объекта - PullRequest
3 голосов
/ 23 февраля 2011

Я хочу выполнить поиск по содержимому свойства в объекте

У меня есть простой класс для определения пользователя:

@Entity
public class User {

    @Id
    @Column(name = "pers_id")
    private int persId; 

    @Column(name = "full_name")
    private String fullName;    

    @OneToMany
    @JoinColumn(name = "PERS_ID")
    private List<UserLanguages> languages = new ArrayList<UserLanguages>();
}

Пользователь может иметь несколько языков, воткласс для установления связи между пользователем и языком.

@Entity
public class UserLanguages {
    @Column(name="pers_id")
    private int persId; 

    @Id
    @Column(name="lang_iso_code")
    private String langISO;

    @Column(name="lang_full_name")
    private String langFullName;

    @Column(name="order_seq")
    private int order;
}

@Entity
public class Language {
    @Id 
    @Column(name="ID")
    private long id;

    @Column(name = "CODE")  
    private String code;
}

Я создал объект для поиска:

public class UserFilter {    
    private String name;

    private List<Language> languages;
}

Я определил службу:

@Service("userService")
public class UserServiceImpl implements UserService {

@Override
public List<User> findByFilter(UserFilter userFilter) {
    final Criteria criteria = userDao.createCriteria();
    if (userFilter.getName() != null) {
        for (final String token : userFilter.getName().toLowerCase().trim().split(" ")) {
        criteria.add(Restrictions.like("fullName", "%" + token + "%"));
        }
    }

    if (null != userFilter.getLanguages() && userFilter.getLanguages().size() > 0) {

        final List<String> contents = new ArrayList<String>(userFilter.getLanguages().size());
        for (final Language lang : userFilter.getLanguages()) {
        contents.add(lang.getCode());
        }    
        criteria.add(Restrictions.in("languages", contents));
    }

    return userDao.findByCriteria(criteria);
}

У меня вопрос, как мне выполнить поиск по языкам?Я хочу найти всех пользователей с этим или этими языками, определенными в параметре userFilter.Часть о языках не работает в методе findByFilter в сервисе.Вы можете мне помочь?

1 Ответ

8 голосов
/ 23 февраля 2011

Прежде всего, сущность UserLanguages должна называться UserLanguage: она представляет один язык, а не несколько.

Тогда столбец pers_id является внешним ключом для сущности User. Таким образом, он должен отображаться как отношение ManyToOne к сущности User, а не как базовый столбец.

Наконец, и чтобы ответить на ваш вопрос (я предполагаю, что вы хотите найти пользователей, имеющих хотя бы один пользовательский язык, чей код langISO находится в списке contents): вы должны использовать объединение:

// inner join between User and UserLanguages
criteria.createAlias("languages", "userLanguage"); 
// restriction on the langISO property of UserLanguage
criteria.add(Restrictions.in("userLanguage.langIso", contents));
...