2012-11-25 6 views
2

아래에서 언급 한 SQL의 HQL을 만들었지 만 Criteria 및 Sub 쿼리로 실행할 수 없습니다. 기준을 통해 다음 쿼리 (SQL & HQL)를 실행하는 데 도움을주십시오. 사전 감사드립니다 ...Criteria Query Many To Many

SQL :

SELECT * FROM app_interface ain WHERE ain.id IN (SELECT ai.id FROM app_interface ai INNER JOIN app_module_interface ami ON ami.interface_id = ai.id INNER JOIN app_module am ON am.id = ami.module_id WHERE am.id = :id 

HQL : 기준을 통해

FROM AppModule oam WHERE oam.id IN(SELECT am.id FROM AppModule am INNER JOIN am.appRoles ar WHERE ar.id = :id) 

이 필요 ..... ?????

는 시나리오 :

public class AppModule implements java.io.Serializable { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id", unique = true, nullable = false) 
private Integer id; 

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "appModules") 
private Set<AppRole> appRoles = new HashSet<AppRole>(0); 

}

는 는 AppRole가 java.io.Serializable을 구현

공용 클래스는 {

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id", unique = true, nullable = false) 
private Integer id; 

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@OrderBy("name") 
@JoinTable(name = "app_role_module", joinColumns = { 
@JoinColumn(name = "role_id", nullable = false, updatable = false)}, inverseJoinColumns = { 
    @JoinColumn(name = "module_id", nullable = false, updatable = false)}) 
private Set<AppModule> appModules = new HashSet<AppModule>(0); 

은}

답변

2

글쎄, 우선, 쿼리가 너무 복잡한. 그것은 당신이 대신 간단하고 읽을 수 HQL 쿼리의 기준을 사용하고 싶은 이유를 모르겠어요

select distinct am from AppModule am 
inner join am.appRoles ar 
WHERE ar.id = :id 

과 같이 다시하지만, 수 당신이 정말로, 다음

Criteria c = session.createCriteria(AppModule.class, "am"); 
c.createAlias("am.appRoles", "ar"); 
c.add(Restrictions.eq("ar.id", theRoleId)); 
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

편집을 사용하려는 경우 : 쿼리

from AppModule oam WHERE oam.id not in (
    select am.id from AppModule am inner am.appRoles ar where ar.id = :id) 

을 구현하려면

, 당신은 다음과 같은 코드를 사용할 수 :

DetachedCriteria dc = DetachedCriteria.forClass(AppModule.class, "am"); 
dc.createAlias("am.appRoles", "ar"); 
dc.add(Restrictions.eq("ar.id", theRoleId)); 
dc.setProjection(Projections.id()); 

Criteria c = session.createCriteria(AppModule.class, "oam"); 
c.add(SubQueries.propertyNotIn("oam.id", dc)); 
+0

나는 최대 절전 모드에 익숙하지 만 너무 새로운 것은 아니다. 그러나 어떤 방법이 ... 감사합니다 –

+0

이 답변은 IN 연산자에 관한 것입니다. 하지만 나는 또한 'FROM AppModule oam 어디 oam.id 안 (SELECT am.id FROM AppModule INNER JOIN am.appRoles ar 어디 ar.id = : id)' –

+0

내 편집 된 답변을 참조하십시오. 여기 –