2

下記のSQLのHQLを作成しましたが、Criteria、Sub queryで実行できません。基準を介して次のクエリ (SQL & HQL) を実行するのを手伝ってください。前もって感謝します...

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);

}

public class 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);

}

4

1 に答える 1

3

まず第一に、クエリは複雑すぎます。次のように書き直すことができます

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

このシンプルで読みやすいHQLクエリの代わりに条件を使用する理由はわかりませんが、本当に必要な場合は、

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));
于 2012-11-25T15:22:54.950 に答える