Вызов javax.persistence.criteria.Path.get(String name)
не подходит для простой иерархии классов, подробно описанной ниже. Звонок завершается успешно, если @IdClass
и второе поле id (то есть id2
) удалены. Кто-нибудь знает, почему это так. Означает ли это, что невозможно запросить одно поле 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);
}