hibernate attribute.setResultTransformer () с projection.distinct (составные внешние ключи) - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть 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

1 Ответ

0 голосов
/ 15 февраля 2012

Почему вы используете проекции, поскольку вы хотите загрузить экземпляр сущности?И зачем использовать Критерии для такого запроса, который не нужно составлять динамически.

Вот соответствующий HQL:

select r from RealizationArchive r 
where r.creditRealization.creditRealizationId = :creditRealizationId 
order by r.archiveSerial desc

Если вы действительно хотите усложнить свою жизнь, ииспользуйте критерии для этого, вам просто нужно это:

Criteria c = session.createCriteria(RealizationArchive.class, "r");
c.add(Restrictions.eq("r.creditRealization.creditRealizationId", creditRealizationId);
c.addOrder(Order.desc("r.archiveSerial"))

Ваш код был бы более читабельным и кратким, если бы вы просто назвали свой идентификатор свойства id.Именование идентификатора CreditRealization creditRealizationId является избыточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...