3

私のオブジェクト:ユーザー資格情報- 多対多の関係ですが、ユーザーにはパラメーターがあります

ループ内のすべての資格情報に対して特定のパラメーターを持つすべてのユーザーを取得したい

要件: ユーザーをバッチでロードする必要があります。

  • 簡単ですよね?

だから私は3つのテーブルを持っています:

@Table(name = "CRED")
public class Credential {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name="CRED_ID")     
    Long credentialId;

    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "credential")
    @BatchSize(size = Search.DEFAULT_PAGE_SIZE)
    private Set<UserCredentialMapping> userCredentialMappingSet;  
}

@Table(name = "USER_CRED")
public class UserCredentialMapping {

    @JoinColumn(name = "user_id", referencedColumnName = "user_id")
    @ManyToOne
    @Filter(name="paramFilter", condition="param = :param")
    private User user;

    @JoinColumn(name = "cred_id", referencedColumnName = "cred_id")
    @ManyToOne
    private Credential credential;
}

@Table(name = "USER")
public class User  {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name="USER_ID")     
    Long userId;

    @Column(name = "PARAM")
    String param
}

私は一箇所でクエリを作成し、結果を返します:

    String hqlQuery =   "select c from UserCredentialMapping m " +
        " inner join m.credential c" +
        " inner join m.user u" +
        " where u.param = :param" +
        " and c.user_id in (:users)" ;

        Session session = getSession();
        //desparetly trying to set filter
        session.enableFilter("paramFilter").setParameter("param", param);

    Query query = session.createQuery(hqlQuery);
    query.setParameterList("users", USERLIST);
    query.setParameter("param", someparam);

    List<Credential> credentialList = (List<Credential>)query.list();
    return credentialList;

その間、各資格情報でいくつかの処理が行われ、指定されたパラメーターを持つユーザーのリストを取得する必要があります。

    for(Credential credential : credentialList){

        //following line makes hibernate query for users
        Iterator<CredentialMapping> mappingIterator = e.getUserCredentialMappingSet().iterator();

        while (mappingIterator.hasNext()){
            UserCredentialMapping userCred = mappingIterator.next();

            User user = userCred.getUser(); 
            DOEVILSTUFFTOINNOCENT(user);
    }

私の問題は、イテレータが、資格情報のすべてのユーザーを取得し、資格情報の指定されたパラメーターを持つすべてのユーザーを取得しない SQL クエリを生成することです(つまり、フィルターが適用されていません)。

それを機能させる方法について何かアドバイスはありますか?

ありがとう !

4

1 に答える 1

0

ManyToMany マッピングを Credential クラスに追加することで解決しました:

@ManyToMany(fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinTable(name = "USER_CRED", 
    joinColumns = { 
        @JoinColumn(name = "CRED_ID") }, 
    inverseJoinColumns = { 
        @JoinColumn(name = "USER_ID") })
@Filter(name="param", condition="PARAM = :param")
@BatchSize(size = Search.DEFAULT_PAGE_SIZE)
private Set<User> users;

UserCredentialMapping を介して機能させることができませんでした...

于 2012-09-22T19:12:45.173 に答える