私はかつてそれに似たものが必要でした、そしてそれを解決するためにReflectionを使わなければなりませんでした。私の場合、hqlを使用してレコードを取得していました。また、これは遅延読み込みとして定義されているレコードを積極的に読み込むために作成したアプローチであるため、最初のメソッドをFetchType.LAZYプロパティを検索せず、常にフェッチするように調整することをお勧めします。
私が構築したメソッドの1つは、遅延フェッチを「準備」します。基本的に2つのアプローチ:@ManyToOneのhqlで「leftjoin fetch」を使用する方法と、@OneToManyおよび@ManyToManyのhibernate.initialize()を使用する方法です。
したがって、この最初のメソッドは、hqlに必要な「leftjohn fetch」を含む文字列を返し、クエリの実行後にHibernate.initialize()によって呼び出される必要があるnToManyフィールドのリストも作成します。
private String buildLazyFetch(Class<? extends GenericEntity> entityClass, List<String> nToManyFields) {
String lazyFetches = new String();
lazyFetches += " fetch all properties ";
// iterate through all fields looking for lazy loaded relationships
for (Field f : entityClass.getDeclaredFields()) {
ManyToOne manyToOne = f.getAnnotation(ManyToOne.class);
if (manyToOne != null) {
if (manyToOne.fetch().equals(FetchType.LAZY)) {
lazyFetches += " left join fetch t." + f.getName() + " ";
}
}
OneToMany oneToMany = f.getAnnotation(OneToMany.class);
if (oneToMany != null) {
if (oneToMany.fetch().equals(FetchType.LAZY)) {
nToManyFields.add(f.getName());
}
}
ManyToMany manyToMany = f.getAnnotation(ManyToMany.class);
if (manyToMany != null) {
if (manyToMany.fetch().equals(FetchType.LAZY)) {
nToManyFields.add(f.getName());
}
}
}
return lazyFetches;
}
hqlが実行された後は、次のように呼び出します。
private void lazyFetchNToMany (List<String> nToManyFields, GenericEntity entity) {
for (String field : nToManyFields) {
try {
Hibernate.initialize(BeanUtils.getProperty(entity, field));
} catch (HibernateException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
これはあなたが期待したものとは正確には一致しないことを理解していますが、希望する解決策が見つからない場合に役立つ可能性があります