Drew H
Drew H

Reputation: 4739

Add logic to a column as your querying using criteria api

I'm not even sure this is possible but I figured it's worth asking. I've been using native query's for this for a long time.

Say I have this query.

    public static List<PkgLoad> findBetweenDatesWrapSpec( PkgLine pkgLine, WrapSpec wrapSpec, Date startDate, Date endDate, boolean metric ) {

    CriteriaBuilder builder = JPA.local.get().em().getCriteriaBuilder();
    CriteriaQuery cq = builder.createQuery( PkgLoad.class );
    Root<PkgLoad> pkgLoad = cq.from( PkgLoad.class );

    Predicate pkgLineQuery = builder.equal( pkgLoad.get( "pkgLineId" ), pkgLine );
    Predicate wrapQuery = builder.equal( pkgLoad.get( "wrapSpecId" ), wrapSpec );
    Predicate dateQuery = builder.between( pkgLoad.get( "timeStamp" ).as( Date.class ), startDate, endDate );

    cq.where( builder.and( pkgLineQuery, wrapQuery, dateQuery ) );
    cq.orderBy( builder.desc( pkgLoad.get( "timeStamp" ) ) );
    Query query = JPA.local.get().em().createQuery( cq );
    return query.getResultList();
}

I have a column called ounces in the model. What if I want to transform ounces into metric depending on a property. Now this property is dependent on the username so overriding the get method is not an option. If I override a get method it messes up the rest of the application. Just wanted to know any options for this. Thanks.

Upvotes: 4

Views: 653

Answers (1)

Pere Villega
Pere Villega

Reputation: 16439

First, I see you are using Play Framework. It may be easier to use the "find" methods from Model (see here) to create the query you want.

Second, if the property depends on the user, it would eb acceptable to store a value int he Play Session when the user logs in that says if the user wants ounces or metric. That way your method only needs to check the session value via:

Scope.Session.current().get("key") //key = key for your value

and change the query accordingly.

Upvotes: 1

Related Questions