2016-08-31 13 views
0

私のアプリケーションは、PostgreSQL 9.5データベースでHibernate 5.02とWildfly 10を使用します。 NamedQueryを介して構築されたエンティティ内で保持されている@OneToManyコレクションのフィルタを有効にしようとしています。残念ながら、フィルタが無視されたように見えます。ここには読みやすいように編集されたさまざまなコンポーネントがあります。Hibernateフィルタが無視される

@NamedNativeQueries({ 
@NamedNativeQuery(
     name = "getAnalystProcess", 
     query = "SELECT * FROM analysis.analystprocess WHERE id = :processId", 
     resultClass = AnalystProcessEntity.class 
)}) 
@FilterDef(
    name = "analystProcessUnanalyzedMsgsFilter", 
    parameters = { @ParamDef(name = "processIds", type = "integer"), @ParamDef(name = "analystIds", type = "integer") }) 
@Filter(name = "analystProcessUnanalyzedMsgsFilter", condition = "analystprocess_id IN (:processIds) AND id NOT IN (SELECT msg_id FROM analysis.analyzedmsg WHERE analyst_id IN (:analystIds) AND analystprocess_id IN (:processIds)) ORDER BY process_msg_id") 
@Entity 
@Table(name = "analystprocess", schema = "analyst") 
public class AnalystProcessEntity implements JPAEntity { 

public static final String GET_PROCESS = "getAnalystProcess"; 
public static final String MSG_FILTER = "analystProcessUnanalyzedMsgsFilter"; 
public static final String MSG_FILTER_PROC_ID_PARAM = "processIds"; 
public static final String MSG_FILTER_ANALYST_ID_PARAM = "analystIds"; 

private static final long serialVersionUID = 1L; 

... 

@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "process") 
@OrderColumn(name = "process_msg_id") 
@LazyCollection(LazyCollectionOption.EXTRA) 
private List<MsgEntity> msgList; 

@Entity 
@Table(name = "msg", schema = "analyst") 
public class MsgEntity implements JPAEntity { 

... 

@ManyToOne(cascade = CascadeType.ALL, optional = false) 
@JoinColumn(name = "analystprocess_id", referencedColumnName = "id") 
private AnalystProcessEntity process; 

@Column(name = "process_msg_id") 
private Integer processMsgId; 

private void buildAnalystProcess() { 
    LOG.info("Building AnalystProcessEntity"); 
    analystUser.getJdbcSession().enableFilter(AnalystProcessEntity.MSG_FILTER) 
       .setParameter(AnalystProcessEntity.MSG_FILTER_PROC_ID_PARAM, analystProcessId) 
       .setParameter(AnalystProcessEntity.MSG_FILTER_ANALYST_ID_PARAM, analystUser.getId()); 

    Query query = analystUser.getJdbcSession().getNamedQuery(AnalystProcessEntity.GET_PROCESS) 
      .setParameter("processId", analystProcessId); 

//  Query query = analystUser.getJdbcSession().createNativeQuery("SELECT * FROM analysis.analystprocess WHERE id = :processId") 
//     .setParameter("processId", analystProcessId) 
//     .addEntity(AnalystProcessEntity.class); 

    analystProcess = (AnalystProcessEntity) query.getSingleResult(); 

CREATE TABLE analysis.analystprocess (
     id SERIAL PRIMARY KEY, 
     name TEXT NOT NULL UNIQUE, 
     description TEXT, 
     created_date TIMESTAMP NOT NULL DEFAULT now(), 
     ... 
); 

CREATE TABLE analysis.msg (
     id SERIAL PRIMARY KEY, 
     analystprocess_id INTEGER NOT NULL REFERENCES analysis.analystprocess(id) ON DELETE CASCADE ON UPDATE CASCADE, 
     process_msg_id INTEGER NOT NULL, 
     constraint tbl_statusid_analystprocessid unique(status_id, analystprocess_id) 
); 

上記からわかるように、私はまた、createNativeQuery代わりにgetNamedQueryと運介しAnalystProcessEntityクラスを構築する上でフィルタを試みました。

ハードコードされた値を持つdefaultConditionを@FilterDefに追加して、デフォルト条件を実行するかどうかを確認しました。

私は@Filterをクラス定義の上だけでなくエンティティ定義より上にしようとしました。私は条件参照エンティティフィールド(変数名)のように聞こえ、テーブルフィールド(列名)ではないと思うブログ記事を見つけました。 EntityとPostgresの表記規則のJava命名規則に固執しようとしていたので、条件内の参照を切り替えて無駄にしようとしました。

私はSQLロギングをHibernateで有効にしており、条件がどこにも表示されないように、単に無視されているかのように表示されます。

ご協力いただければ幸いです!

答えて

0

問題は、間違ったクラスに@FilterDefを適用したことです。私がフィルタリングしようとしているMsgEntityコレクションを保持するAnalystProcessEntityを構築していたため、@FilterDefがAnalystProcessEntityクラスに適用されるということが私の前提でした。代わりに、実際にフィルタリングしているエンティティに適用する必要があります(20/20の見方があります)。

さらに、実際の条件を変更して、サブ選択クエリ内の完全な参照を使用する必要がありました。

@NamedNativeQueries({ 
@NamedNativeQuery(
     name = "getAnalystProcess", 
     query = "SELECT * FROM analysis.analystprocess WHERE id = :processId", 
     resultClass = AnalystProcessEntity.class 
)}) 
@Filter(name = "analystProcessUnanalyzedMsgsFilter", condition = "id NOT IN (SELECT amsg.msg_id FROM analysis.analyzedmsg amsg WHERE amsg.analyst_id IN (:analystIds) AND amsg.analystprocess_id IN (:processIds))") 
@Entity 
@Table(name = "analystprocess", schema = "analyst") 
public class AnalystProcessEntity implements JPAEntity { 

public static final String GET_PROCESS = "getAnalystProcess"; 
public static final String MSG_FILTER = "analystProcessUnanalyzedMsgsFilter"; 
public static final String MSG_FILTER_PROC_ID_PARAM = "processIds"; 
public static final String MSG_FILTER_ANALYST_ID_PARAM = "analystIds"; 

private static final long serialVersionUID = 1L; 

... 

@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "process") 
@OrderColumn(name = "process_msg_id") 
@LazyCollection(LazyCollectionOption.EXTRA) 
private List<MsgEntity> msgList; 
さらに
@FilterDef(
    name = "analystProcessUnanalyzedMsgsFilter", 
    parameters = { @ParamDef(name = "processIds", type = "integer"), @ParamDef(name = "analystIds", type = "integer") }) 
@Entity 
@Table(name = "msg", schema = "analyst") 
public class MsgEntity implements JPAEntity { 

... 

@ManyToOne(cascade = CascadeType.ALL, optional = false) 
@JoinColumn(name = "analystprocess_id", referencedColumnName = "id") 
private AnalystProcessEntity process; 

@Column(name = "process_msg_id") 
private Integer processMsgId; 

、私がnullのコレクションに登場すると別の問題に遭遇した、という事実にもかかわらず、私が使用していることを私は、これはいくつかの点で誰かを役に立てば幸い

... @OrderColumn、私はその問題を修正したと思った。 @Filterを使用すると、フィルタリングされたOUT(除外)の代わりにnullが挿入されたように見えます。

関連する問題