【问题标题】:Add logic to a column as your querying using criteria api使用条件 api 将逻辑添加到列作为查询
【发布时间】:2011-08-25 19:49:00
【问题描述】:

我什至不确定这是否可能,但我认为值得一问。很长一段时间以来,我一直在使用本机查询。

假设我有这个问题。

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

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

【问题讨论】:

    标签: jpa playframework jpa-2.0 criteria-api


    【解决方案1】:

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

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

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

    并相应地更改查询。

    【讨论】:

    • 不是我想要的。我已经使用了 play find 方法,但在这种情况下它不起作用。查看数据库中的数据以盎司为单位。我需要应用一个计算来得到克。我知道我可以获取该值并在 java 中计算它,但我想即时计算它并将其映射到列,如果这有意义的话。
    • @Drew H(编辑)然后你需要 JPQL(见docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/…
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多