javax.persistence.criteria.Path.get(String name)
を呼び出すことは、以下で説明する単純なクラス階層では失敗します。 @IdClass
と2番目のIDフィールド(つまりid2
)が削除された場合、呼び出しは成功します。誰でもこれがなぜそうであるか知っている。これは、そのidフィールドがコンポジットキーの一部を形成する単一のidフィールドでクエリすることができないことを意味しますか?Hibernate 4.0:コンポジットキーのフィールドが指定されている場合、javax.persistence.criteria.Path.getが失敗する
失敗コールは次のとおりです。Path<Object> path = entity.get(name);
private static final EntityManager em;
private final CriteriaBuilder cb = em.getCriteriaBuilder();
private final CriteriaQuery<Y> query = cb.createQuery(Y.class);
private final Root<Y> entity = query.from(Y.class);
static {
Map<String, Object> properties = new HashMap<String, Object>();
// initialise properties appropriately
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("test", properties);
em = emf.createEntityManager();
}
interface PK {
Object getPK();
}
public static class YPK implements Serializable {
int id;
int id2;
YPK(int id, int id2) { }
// Override hashCode() and equals() appropriately
}
@IdClass(YPK.class)
@Entity
public static class Y implements Serializable, PK {
@Id
int id;
@Id
int id2;
protected Y() { }
public Y(int id) {
this.id = id;
}
@Override
public Object getPK() {
return id;
}
}
@Test
public void simpleTest() {
List<Y> yy = new ArrayList<Y>();
Y yX1 = new Y(5);
yy.add(yX1);
Y yX2 = new Y(6);
yy.add(yX2);
saveItems(yy);
String name = "id";
Path<Object> path = entity.get(name);
Predicate restriction = cb.conjunction();
restriction = cb.and(restriction, cb.and(new Predicate[]{cb.equal(path, 5)}));
TypedQuery<Y> tq = em.createQuery(this.query);
Y result = null;
try {
result = tq.getSingleResult();
} catch (NoResultException e) {
}
assertNotNull(result);
}