У меня есть SQL:
SELECT DISTINCT archiveSer, clas, classifdegree
FROM realization_archive
WHERE realId = 2
ORDER BY archiveSer DESC
Мои таблицы отображаются в спящем режиме следующим образом:
основная таблица (creation_archive):
public class RealizationArchive implements Serializable {
@Id
@Access(AccessType.PROPERTY)
@Column(name = "archiveSer", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long archiveSerial;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
@JoinColumn(name = "realId", referencedColumnName = "realId", nullable = false)
private CreditRealization creditRealization;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY, optional = true)
@JoinColumns({ @JoinColumn(name = "classif", referencedColumnName = "classif"), @JoinColumn(name = "classifdegree", referencedColumnName = "classifdegree") })
private ClassificationDegree classification;
...
}
составной объектвнешний ключ в главной таблице RealizationArchive (creation_archive)
public class ClassificationDegree implements Serializable{
@Id
@Access(AccessType.PROPERTY)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "classif", referencedColumnName = "clas", nullable = false)
private ClassificationLevel classificationLevel;
@Column(name = "classifdegree")
private Integer classificationDegree;
...
}
простой ключ foregin в ClassificationDegeree
public class ClassificationLevel implements Serializable {
@Id
@Access(AccessType.PROPERTY)
@Column(name = "clas", nullable = false)
private Integer classificationLevelId;
...
}
простой внешний ключ в RealizationArchive
public class CreditRealization implements Serializable{
@Id
@Access(AccessType.PROPERTY)
@Column(name = "realId", nullable = false)
private Long creditRealizationId;
...
}
Я пытаюсьсделать ранее упомянутый SQL-запрос с критериями, подобными этим:
Criteria criteria = getSession().createCriteria(RealizationArchive.class);
criteria.add(Restrictions.eq("creditRealization.creditRealizationId", creditRealizationId));
criteria.addOrder(Order.desc("archiveSerial"));
criteria.setProjection(Projections.distinct(Projections.projectionList().add(Projections.property("creditRealization").as("creditRealization"))
.add(Projections.property("archiveSerial").as("archiveSerial"))
.add(Projections.property("classification").as("classification"))));
criteria.setMaxResults(1);
criteria.setResultTransformer(Transformers.aliasToBean(RealizationArchive.class));
return criteria.uniqueResult();
}
НО, моя проблема заключается в том, что в объекте, который возвращается (RealizationArchive) значения для полей RealizationArchive.classification.classificationDegree и RealizationArchive.classification.classificationLevel.classificationLevelIdне загружены должным образом.(они имеют нулевые значения, но в БД они, например, 0, 1).Это работает для простого внешнего ключа (например, для creditRealization [realId]), но когда у меня есть составные внешние ключи (например, для классификации [classif, classifdegree]), значения не загружаются ... В итоге, мой запрос SQL генерирует просто отлично (синтаксически), НО возвращающий объект имеет все значения, установленные corectlly, за исключением тех, которые являются частью составного внешнего ключа (то есть ,lassLevelId (имя базы данных - clas) иificationDegree (имя базы данных - clasifdegree)) ...
Можно ли это сделать по критериям и если да, то как?Я не понимаю, что я делаю не так?Мы ценим любую помощь, заранее благодарим за ваше время и терпение:)
mismas