У меня есть 2 класса:
@Entity
@Table(name = "DRCOMMENTS" ,schema = "XXX")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Drcomments.findAll", query = "SELECT d FROM Drcomments d"),
public class Drcomments implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected DrcommentsPK drcommentsPK;
@Size(max = 50)
@Column(name = "SDESC")
private String commentSecondaryCodeDescription;
}
@Embeddable
public class DrcommentsPK implements Serializable {
@Column(name = "CODE")
private Short commentPrimaryCode;
@NotNull
@Column(name = "SCODE" , length=5)
private Short commentSecondaryCode;
}
Я пытаюсь создать запрос с динамическим порядком и параметром, например: я хочу выбрать все записи Drcomments, когда DrcommentsPK.commentPrimaryCode равен 1, а порядок будет DrcommentsPK.commentSecondaryCode. это то, что я пробовал:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Drcomments> q = cb.createQuery(Drcomments.class);
Root<Drcomments> c = q.from(Drcomments.class);
q.select(c);
q.where(cb.equal(c.get("drcommentsPK").get("commentPrimaryCode"), 1));
Path<Drcomments> valuePath = c.get("drcommentsPK").get("commentSecondaryCode");
Order[] orders;
if(sord.equals("desc"))
{
orders = new Order[] {cb.desc(valuePath)};
}
else
{
orders = new Order[] {cb.asc(valuePath)};
}
q.orderBy(orders);
query = em.createQuery(q);
query.setFirstResult(start);
query.setMaxResults(start + limit);
results = query.getResultList();
Проблема в том, что список результатов, который я получаю, не отсортирован в порядке описания commentSecondaryCode.
я делаю что-то не так? Как это может быть сделано? как создать запрос, который будет упорядочен по полю внутри класса emeddable?
ОБНОВЛЕНИЕ: это сгенерированный sql, который я получаю:
SELECT * FROM
(SELECT * FROM
(SELECT EL_TEMP.*, ROWNUMBER() OVER() AS EL_ROWNM FROM
(SELECT CMSSDESC AS a1, CMSSCODE AS a4, CMSPCODE AS a5 FROM DRCOMMENTS
WHERE (CMSPCODE = 1) ORDER BY CMSSCODE DESC, CMSPCODE DESC)
AS EL_TEMP)
AS EL_TEMP2 WHERE EL_ROWNM <= 50)
AS EL_TEMP3 WHERE EL_ROWNM > 0
когда я запускаю этот код, он не возвращает записи в порядке описания CMSSCODE.. (поскольку порядок должен быть во внешнем выборе..) мне нужно что-то изменить в query.setFirstResult()
и query.setMaxResults()
? Как мне добавить его в конец запроса критериев, чтобы он был в последнем выборе?
Заранее спасибо.
<property name="hibernate.show_sql">true</property>
в XML-файл сохранения. - person Rasmus Franke   schedule 01.07.2012query.setFirstResult()
иquery.setMaxResults()
... но они мне нужны, так что это не вариант. Я тестировал sql, и проблема в sql даже с одним подвыбором. когда естьselect from select
и во внутреннем выборе есть порядок, результат не будет отсортирован. поэтому я думаю, что мне нужно добавить порядок после набора first/max, возможно ли это? спасибо. - person user590586   schedule 02.07.2012order by filed_name desc
вover()
. Могу ли я сделать это с моим текущим CriteriaQuery? как это можно добавить в запрос? еще раз спасибо. - person user590586   schedule 11.07.2012over()
? Вы просто хотите отсортировать по другому полю? - person Rasmus Franke   schedule 11.07.2012