2009-06-04 6 views
9

에 쿼리를 조인 작성하는 방법 나는 많은 두 콩 사용자 및 버추얼 도메인 (VirtualDomain)를 만든 최대 절전 모드를 통해 특정 도메인과 관련된 사용자 이름과 같은 사용자의 데이터를 얻을 수있는 방법 최대 절전 모드

@Entity 
@Table(name = "tblUser") 
public class User implements Serializable { 
    private Long id; 
    private String username; 
    private Set<VirtualDomain> virtualdomainset; 
@Id 
@Column(name = "id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

@Column(name = "username", length = 50, nullable = false) 
public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 
    @ManyToMany(targetEntity = VirtualDomain.class, cascade = {CascadeType.PERSIST},fetch=FetchType.EAGER) 
    @JoinTable(name = "tblUserDomainRel", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "domainid")) 
    public Set<VirtualDomain> getVirtualdomainset() { 
     return virtualdomainset; 
    } 

    public void setVirtualdomainset(Set<VirtualDomain> virtualdomainset) { 
     this.virtualdomainset = virtualdomainset; 
    } 

} 

@Entity 
@Table(name = "tblVirtualDomain") 
public class VirtualDomain { 
    private Long id; 
    private String domainname; 
    private Set<User> userset; 
@Id 
@JoinColumn(name = "id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

@Column(name = "domain_name") 
public String getDomainname() { 
    return domainname; 
} 

public void setDomainname(String domainname) { 
    this.domainname = domainname; 
} 
@ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class) 

public Set<User> getUserset() { 
    return userset; 
} 

public void setUserset(Set<User> userset) { 
    this.userset = userset; 
} 
} 

관계

많은합니다.

답변

10

gid의 답변에 추가하려면 몇 가지 이유로 entites 릴레이션을 열정적으로 가져와야하는 경우 조인 구문을 join fetch로 지정하십시오.

from VirtualDomain vd join fetch vd.usersset u 
    where vd.domainname = 'example.com' and u.username like 'foo%' 
+0

안녕 블레이크. 제발 도와주세요 이 쿼리를 사용하면 java.lang.NoSuchMethodError 오류가 발생합니다 : org.hibernate.hql.antlr.HqlBaseParser.recover (Lantlr/RecognitionException; Lantlr/collections/impl/BitSet;) V – Jugal

+0

' 쿼리를 편집했는데 쿼리에 사용자가 없어야합니다. –

+0

편집 된 쿼리는 괜찮은 것처럼 보이지만 사용자의 사용자 이름 필드 만 입력하면됩니다. select u.username과 같은 select 절을 추가하면 오류가 발생합니다. org.hibernate.QueryException : 쿼리가 조인을 조인하도록 지정되었지만 페치 된 연결의 소유자가 아닙니다. 선택 목록에 있음 – Jugal

2

항상 differcult의 할 일 테스트 시스템 밖으로 HQL ...하지만 여기에 우리가 간다 :

select u from VirtualDomain vd join User vd.usersset u 
     where vd.domainname = 'example.com' and u.username like 'foo%' 

날 당신이 얼마나 알려주십시오.

Intellji를 구입하기 전에 자주 한 가지 팁은 디버거에서 앱을 중지 한 다음 직접 실행 창을 사용하여 HQL을 실험하는 것이 었습니다.

조인에 대한 hibernate documentation은 항상 제 의견으로는 약간의 숨겨진 것입니다.

+0

감사하지만 난 '푸 %'와 같은 그쪽으로 마지막 조건 v.name를 이해할 수 – Jugal

+0

즉, SQL에서 발견되는 같은 조항의 같은 종류입니다. http://www.sql-tutorial.net/SQL-LIKE.asp –

+0

은 오타를 수정했습니다. 블레이크 (Blake)는 like 절이 SQL과 동일하다는 것을 말합니다 –