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
> 
> 

Reply via email to