Hi John,
I've created a fix for this, which you filed as DELTASPIKE-1105. Would you 
accept a patch (as per http://deltaspike.apache.org/community.html) or a pull 
request? 
Cheers,Luigi
 

    On Thursday, March 31, 2016 12:43 PM, John D. Ament <[email protected]> 
wrote:
 

 Hi Luigi,
I think really the only way to solve this is to add the methods to disable 
prefixing the entity name.  Even adding more attributes to control the entity 
name won't fix it, as the join problem you described will exist.
John

On Thu, Mar 31, 2016 at 5:35 AM Luigi Bitonti <[email protected]> 
wrote:

Hi John,
Many thanks for your help with this. I am afraid neither of your solutions 
would work for what I can see. 
What I am currently trying to implement is custom (i.e. client selected) 
sorting for a jpaql query. Something that looks a bit like this (in a 
simplified version as the real thing is more complex):
 SELECT DISTINCT b FROM  Booking b JOIN FETCH b.items bi2 JOIN FETCH 
bi2.location l WHERE b.organisation = :organisation   AND b.timeFrom < 
:intervalEnd   AND b.timeTo > :intervalStart   AND b.status IN :statuses; 
If I use 'e' instead of 'b' as alias for the Booking entity, everything works 
if I only order by attributes of Booking (e.g. e.timeFrom), but I cannot order 
by e.items.id as I get an error (using eclipselink at least) that the attribute 
cannot be accessed as I should really be using bi2.id, which I cannot use 
though as that is transformed into e.b2.id.
The only solution that I can see would work with every use case I can think of, 
is to have a way to avoid the 'e' being prepended. This could be:
1) Adding 2 extra methods to QueryResult that allow to order by a raw string 
attribute (i.e. as it is). These could be called orderAscRaw and orderDescRaw 
or something similar. 
2) Alternatively, a similar solution could be that there are overloaded 
versions of orderAsc(String attribute, boolean useEntityPrefix) and orderDesc. 
This still adds 2 extra methods to the interface (which is not really great).
3) Using a hint, but for what I can see this would be ugly in my opinion as the 
hint might be applied after the sorting(s) and therefore the implementation 
would have to "scan" the query and remove existing 'e' prefixes from the order 
by clause.  
I am not a great fan of overloading, so I'd personally go with 1), but I am not 
sure if this is acceptable or there are better solutions I have overlooked. If 
it is acceptable I can make the change a create a pull request if that helps.
Cheers,Luigi 

    On Thursday, March 31, 2016 1:09 AM, John D. Ament <[email protected]> 
wrote:


 Luigi,
Actually would you be able to provide the exact query statement you have in 
your repo.  The reason it fails in this test is because the query looks like 
this:
@Query("select s from Simple s")    public abstract QueryResult<Simple> 
queryAll();
Whereas the identifier is expecting e, in order to work with QueryResult.  A 
similar problem happens with the named query when I change the identifier.
There's a couple of thoughts I had.1. We can introduce an attribute in query 
(or even a hint) that says what the identifier is in "select s from Something 
s".  This would be more robust and configurable, but introduce a burden.
2. Update documentation to clarify that "e" should be used as your query 
identifier by default.
John
On Wed, Mar 30, 2016 at 7:50 PM John D. Ament <[email protected]> wrote:

Thank you Luigi!I'm able to reproduce, I'll create a ticket.
John

On Wed, Mar 30, 2016 at 4:59 AM Luigi Bitonti <[email protected]> wrote:

Hi John,
If you add the following test to QueryResultTest.java in deltaspike-data-module:
    @Test    public void should_sort_all_result()    {        List<Simple> 
result = repo.queryAll()
                .orderDesc(Simple_.counter)                
.orderAsc(Simple_.id)                .getResultList();    }
 You'll get the following error:

Tests in error:   
should_sort_all_result(org.apache.deltaspike.data.impl.QueryResultTest): 
org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'e.counter' 
[select s from org.apache.deltaspike.data.test.domain.Simple s order by 
e.counter DESC,e.id ASC]
This is an overly simplistic case that could be worked around by using 'e' as 
an alias in queryAll (instead of 's'), but in more complex case with joins and 
order by clauses that use associated entities there's no workaround that I can 
see.
I tried (briefly I must confess) to work around this by creating an alternative 
QueryBuilderFactory that could then allow me to avoid using 
WrappedQueryBuilder, DefaultQueryResult and (ultimately) 
OrderByQueryStringPostProcessor but code duplication made the solution rather 
ugly, so I gave up and decided to ask. 
Cheers,Luigi 
    On Wednesday, March 30, 2016 12:32 AM, John D. Ament 
<[email protected]> wrote:


 Luigi,
Do you happen to have a test that can reproduce this?
John

On Tue, Mar 29, 2016 at 5:20 PM Luigi Bitonti <[email protected]> 
wrote:

Hi all,
I am having issues with using the orderAsc and orderDesc methods on QueryResult 
as the order by clause always ends up having an "e." prepended to its sort-by 
properties (e.g "...order by e.i.date_from" instead of  "...order by 
i.date_from". Is there any way to avoid that from happening?I am using 
Deltaspike 1.4.2 but from what I can see in the OrderByQueryStringPostProcessor 
source this is still the case in 1.5.4 and also current git master.
Many thanks,Luigi 






  


  

Reply via email to