使用条件api将逻辑添加到列作为查询

时间:2011-08-25 19:49:00

标签: jpa playframework jpa-2.0 criteria-api

我甚至不确定这是可能的,但我认为值得一提。我长期以来一直在使用本机查询。

说我有这个问题。

    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();
}

我在模型中有一个名为盎司的列。如果我想根据属性将盎司转换为公制,该怎么办?现在这个属性依赖于用户名,因此覆盖get方法不是一个选项。如果我覆盖一个get方法,它就会混淆应用程序的其余部分。只是想知道任何选择。感谢。

1 个答案:

答案 0 :(得分:1)

首先,我看到您正在使用Play Framework。使用Model中的“find”方法(参见here)创建所需的查询可能更容易。

其次,如果属性依赖于用户,那么当用户登录时,可以接受在Play Session中存储值,该值表示用户是否需要盎司或公制。这样,您的方法只需要通过以下方式检查会话值:

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

并相应地更改查询。