2011-02-23 6 views
3

엔티티의 속성 목록 내용으로 검색최대 절전 모드 기준 : 내가 엔티티에 속성을 내용으로 검색 할

나는 사용자 정의 할 수있는 간단한 클래스가 :

@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 param에 정의 된 언어를 가진 모든 사용자를 찾고 싶습니다. 언어에 관한 부분이 서비스의 findByFilter 메소드에서 작동하지 않습니다. 나 좀 도와 줄 수있어?

답변

8

먼저 UserLanguages 엔티티는 UserLanguage으로 지정해야합니다. 이는 하나가 아닌 하나의 언어를 나타냅니다.

그러면 pers_id 열은 User 엔티티의 외래 키입니다. 따라서 기본 열이 아닌 사용자 엔터티에 대한 ManyToOne 관계로 매핑되어야합니다.

마지막으로, 당신의 질문에 대답 (난 당신이 그 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)); 
+1

: 당신은 조인을 사용한다 감사합니다. UserLanguages를 UserLanguage로 변경했습니다. 이제, ManyToOne 관계를 사용했습니다. 하지만 언어가 어디에서 왔는지 이해하지 못합니다. 마지막 제한에 있습니까? – BasicCoder

+0

죄송합니다. 큰 따옴표와 사용자 접두사를 잊어 버렸습니다. 나는 나의 대답을 업데이트했다. –