Hi Pedro,
In fact, it is common to use dynamic filtering, and CriteriaSupport let you
do it. The only problem for you, as I understand, is that you can't
paginate your resultset, after it is returned as list of objects, and not
QueryResult. But this use case is not so common (not for web solutions at
least). You rather don't read resultset page by page in one request, but
you show exact page per each request, and you can do this with
CriteriaSupport also.
Example code:
@Repository
public abstract class YourEntityRepository extends
AbstractEntityRepository<YourEntity, Integer>
implements CriteriaSupport<YourEntity> {
public List<YourEntity> find(YourEntitySearchParams searchParams, int
firstResult, int maxResults) {
Criteria<YourEntity, YourEntity> criteria = criteria();
if (searchParams.nameLike != null) {
criteria.like(YourEntity_.name, "%" + searchParams.nameLike
+ "%");
}
// appending criteria from other params here ...
return
criteria.createQuery().setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
}
public static class YourEntitySearchParams {
public String nameLike;
public Date dateFrom;
public Date dateTo;
}
}
2016-02-26 13:34 GMT+01:00 Pedro Belmino <[email protected]>:
> THAT'S IT. Daniel Cunha is right. It's very common that a screen that uses
> paging is filled with dynamic filters.
> So the framework allow not make a dynamic query with paging ?
>
> 2016-02-26 9:20 GMT-03:00 Daniel Cunha <[email protected]>:
>
> > I don't know why the javadoc is not published for last version.
> >
> > Someone can see that?
> >
> > On Fri, Feb 26, 2016 at 4:18 AM, Daniel Cunha <[email protected]>
> > wrote:
> >
> > > If I get it, he want to use QueryResult to have easy way to navigate[1]
> > on
> > > pages.
> > > I proposed that he use the Criteria API, but it not sound good for he.
> > >
> > > I don't know a
> > >
> > > [1]
> > >
> >
> https://deltaspike.apache.org/javadoc/1.5.2/org/apache/deltaspike/data/api/QueryResult.html#nextPage()
> > >
> > > On Fri, Feb 26, 2016 at 4:13 AM, John D. Ament <[email protected]>
> > > wrote:
> > >
> > >> Hi,
> > >>
> > >> Are you sure you need to return query result? Seems like you're
> crossing
> > >> boundaries.
> > >>
> > >> typedQuery("").setFirstResult(2).setMaxResults(4).getResultList()
> > >>
> > >> That should take care of the pagination for you.
> > >>
> > >> John
> > >>
> > >> On Fri, Feb 26, 2016 at 6:58 AM Pedro Belmino <[email protected]
> >
> > >> wrote:
> > >>
> > >> > Hi,
> > >> > Daniel Cunha,
> > >> >
> > >> > I appreciate the support but this solution to make the logic in the
> > >> > business layer is not viable for me , I would have to combine all
> the
> > >> > possible filters.
> > >> >
> > >> > I'm at that point, but still no solution.
> > >> > public QueryResult<Person>
> findByNameLikeIgnoreCaseAndAssigment(String
> > >> > name, Assigment assigment, @FirstResult int start, @MaxResults int
> > >> > pageSize){ String queryString = "select p "+ " FROM Person p " +
> > "WHERE
> > >> > p.name = :name and p.assigment = :assigment";
> javax.persistence.Query
> > >> > query
> > >> > = entityManager().createQuery(queryString);
> query.setParameter("name",
> > >> > name); query.setParameter("assigment", assigment);
> QueryResult<Person>
> > >> d =
> > >> > new DefaultQueryResult<>(new QueryBuilder() { @Override protected
> > Object
> > >> > execute(CdiQueryInvocationContext ctx) {
> > >> > ctx.applyJpaQueryPostProcessors(query); return
> > ctx.executeQuery(query);
> > >> }
> > >> > }, cdiQueryContextHolder.get());// OCCURS NullPointerException
> return
> > >> d; }
> > >> >
> > >> > Can someone help me?
> > >> >
> > >> > 2016-02-25 15:11 GMT-03:00 Daniel Cunha <[email protected]>:
> > >> >
> > >> > > Hi Pedro,
> > >> > >
> > >> > > You can try that:
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> https://github.com/apache/deltaspike/blob/master/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepository.java#L103
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> https://github.com/apache/deltaspike/blob/master/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/QueryResultTest.java#L167
> > >> > >
> > >> > > So, you'll create methods on your repository, something like:
> > >> > > findByNameLikeIgnoreCase
> > >> > > findByAssigment
> > >> > > findByNameLikeIgnoreCaseAndAssigment
> > >> > >
> > >> > >
> > >> > > So you can put your business logic on your business class.
> > >> > >
> > >> > > You'll call the method that you need:
> > >> > >
> > >> > > @Inject
> > >> > > private RepositoryClass repository
> > >> > >
> > >> > > if (YOUR_LOGIC)
> > >> > > repository.findByNameLikeIgnoreCaseAndAssigment
> > >> > > ...
> > >> > >
> > >> > > To be honest, I don't know if possible to do like you was trying.
> > >> > > I needed checking it.
> > >> > >
> > >> > >
> > >> > > On Thu, Feb 25, 2016 at 2:04 PM, Pedro Belmino <
> > >> [email protected]>
> > >> > > wrote:
> > >> > >
> > >> > > > Daniel,
> > >> > > > OK to return an object of type List<Person>.
> > >> > > >
> > >> > > > However i need return an QueryResult<Person>, because the
> > >> pagination is
> > >> > > > important for me.
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > 2016-02-25 13:59 GMT-03:00 Daniel Cunha <[email protected]>:
> > >> > > >
> > >> > > > > Hi Pedro,
> > >> > > > >
> > >> > > > > JPA Criteria API Support sounds better for this cases:
> > >> > > > >
> > >> > > >
> > >> > >
> > >> >
> > >>
> >
> http://deltaspike.apache.org/documentation/data.html#JPACriteriaAPISupport
> > >> > > > >
> > >> > > > > On Thu, Feb 25, 2016 at 1:50 PM, Pedro Belmino <
> > >> > [email protected]
> > >> > > >
> > >> > > > > wrote:
> > >> > > > >
> > >> > > > > > Hello,
> > >> > > > > > I need construct an method that receive dynamic parameters
> for
> > >> HQL
> > >> > > > query
> > >> > > > > > construct.
> > >> > > > > >
> > >> > > > > > For example:
> > >> > > > > > @Repository(forEntity = Person.class)
> > >> > > > > > public abstract class PersonCustomRepository extends
> > >> > > > > > AbstractEntityRepository<Person, Long> {
> > >> > > > > >
> > >> > > > > > public QueryResult<Person>
> > >> > > > > > findByNameLikeIgnoreCaseAndAssigment(String name,
> > >> > > > > > Assigment assigment, @FirstResult int start, @MaxResults int
> > >> > > pageSize){
> > >> > > > > > String query = "select p from person p WHERE 1 = 1 ";
> > >> > > > > > if(name!=null&&!name.equals("")){
> > >> > > > > > query+= " and name = ?1 ";
> > >> > > > > > }
> > >> > > > > > if(assigment!=null){
> > >> > > > > > query+= " and assigment = ?2 ";
> > >> > > > > > }
> > >> > > > > > // WHAT IS NECESSARY CODE FOR RETURN paginated object of
> type
> > >> > > > > > QueryResult<Person>.
> > >> > > > > > }
> > >> > > > > > }
> > >> > > > > >
> > >> > > > > > I'm doing something wrong? I do otherwise?
> > >> > > > > >
> > >> > > > > > --
> > >> > > > > >
> > >> > > > > >
> > >> > > > > >
> > >> > > > > > *Pedro Belmino *System Analist
> > >> > > > > > Laboratory of Mobile Computing and Design
> > >> > > > > > Federal University of Ceará
> > >> > > > > > Office: + 55 85 3366-9797
> > >> > > > > > E-mail: [email protected] <
> > >> [email protected]>
> > >> > > > > >
> > >> > > > >
> > >> > > > >
> > >> > > > >
> > >> > > > > --
> > >> > > > > Daniel Cunha
> > >> > > > > https://twitter.com/dvlc_
> > >> > > > > http://www.tomitribe.com
> > >> > > > >
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > --
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > *Pedro Belmino *System Analist
> > >> > > > Laboratory of Mobile Computing and Design
> > >> > > > Federal University of Ceará
> > >> > > > Office: + 55 85 3366-9797
> > >> > > > E-mail: [email protected] <
> [email protected]
> > >
> > >> > > >
> > >> > >
> > >> > >
> > >> > >
> > >> > > --
> > >> > > Daniel Cunha
> > >> > > https://twitter.com/dvlc_
> > >> > > http://www.tomitribe.com
> > >> > >
> > >> >
> > >> >
> > >> >
> > >> > --
> > >> >
> > >> >
> > >> >
> > >> > *Pedro Belmino *System Analist
> > >> > Laboratory of Mobile Computing and Design
> > >> > Federal University of Ceará
> > >> > Office: + 55 85 3366-9797
> > >> > E-mail: [email protected] <[email protected]>
> > >> >
> > >>
> > >
> > >
> > >
> > > --
> > > Daniel Cunha
> > > https://twitter.com/dvlc_
> > > http://www.tomitribe.com
> > >
> >
> >
> >
> > --
> > Daniel Cunha
> > https://twitter.com/dvlc_
> > http://www.tomitribe.com
> >
>
>
>
> --
>
>
>
> *Pedro Belmino *System Analist
> Laboratory of Mobile Computing and Design
> Federal University of Ceará
> Office: + 55 85 3366-9797
> E-mail: [email protected] <[email protected]>
>
--
Pozdrawiam,
Wojtek Żaboklicki