Just an idea, but maybe the Query query = entityManager.createQuery(qDef);
Should come after this: List<Order> orderList = makeOrderList(builder, qDef.from(persistentClass), orderFields); if (!orderList.isEmpty()) { qDef.orderBy(orderList); } ? Cheers, John ---- Who is General Failure, and why is he reading my hard disk? > -----Original Message----- > From: Miguel Muñoz [mailto:swingguy1...@yahoo.com] > Sent: Thursday, May 30, 2013 11:08 AM > To: users@openjpa.apache.org > Subject: Ordering results obtained through query-by-example > > Comrades, > > I'm using the OpenJPA query-by-example API, and it works fine unless I > order my results. When I do that, I get way too many results. If I search > without specifying an order, I get 4 results from a table of 9 rows. If I > specify > an order, I get 36 results instead. (I get everything four times.) The number > I > get is always the number I'm supposed to get multiplied by the number of > rows. > > Has anybody else seen this behavior? I'm trying to figure out if I'm doing > something wrong, or if it's a bug in the JPA code. > > Here's my method, if you're interested: > > private final Class<E> persistentClass; > > public List<E> findByExample( > @NotNull E exampleInstance, > @Nullable Attribute<E,?>[] excludeProperty, > SingularAttribute<E,?>. orderFields > ) throws DAORuntimeException { > EntityManager entityManager = JpaUtil.getEntityManager(); > OpenJPACriteriaBuilder builder = (OpenJPACriteriaBuilder) > entityManager.getCriteriaBuilder(); > CriteriaQuery<E> qDef = > builder.createQuery(persistentClass); > Root<E> from = qDef.from(persistentClass); > qDef.select(from); > qDef.where(builder.qbe(from, exampleInstance, > excludeProperty)); // query by example > Query query = entityManager.createQuery(qDef); > > List<Order> orderList = makeOrderList(builder, > qDef.from(persistentClass), orderFields); > if (!orderList.isEmpty()) { > qDef.orderBy(orderList); > } > > return (List<E>) query.getResultList(); > } > > private List<Order> makeOrderList( > CriteriaBuilder builder, > Root<E> root, > SingularAttribute<E, ?>[] pOrderFields > ) { > List<Order> orderList = new LinkedList<>(); > for (SingularAttribute<E, ?> attribute: pOrderFields) { > orderList.add(builder.asc(root.get(attribute))); > } > return orderList; > } > > > If I call it like this, it works fine: > > List<Incident> dIncidentList = > incidentDao.findByExample(dExample, null); > > If I call it like this, it returns lots of duplicates: > > List<Incident> dIncidentList = > incidentDao.findByExample(dExample, null, Incident_.entryTime); > > Is it me? Has anyone else seen this bug? > > > ------------------------------------------- > > Miguel Muñoz > swingguy1...@yahoo.com > 323/225-7285 > > ------------------------------------------- > > The Sun, with all those planets revolving around it and dependent on it, can > still ripen a vine of grapes like it had nothing else to do in the world. > > -- Galileo > > ------------------------------------------- > > There are seven sins in the world. > Wealth without work. > Pleasure without conscience. > Knowledge without character. > Commerce without morality. > Science without humanity. > Worship without sacrifice. > Politics without principle. > > -- Mohandas Gandhi > > ------------------------------------------- > > If tyranny and oppression come to this land, it will come in the guise of > fighting a foreign enemy. > > -- James Madison > >