【问题标题】:How to pass value to sqlRestriction of hibernate?如何将值传递给休眠的sqlRestriction?
【发布时间】:2015-06-11 12:51:36
【问题描述】:

我需要根据几个不同的限制来检索项目,一个是代码为 234,另一个是计算的数量小于 10,但我不知道如何将值传递给 sqlRestrictions 方法。

我使用的是 {alias},但它传递的是 Item 而不是 city。

List<Store> stores = (List<Store>) sessionFactory.getCurrentSession()
                .createCriteria(Item.class)
                .createAlias("Address", "address")
                .createAlias("address.myJoinTable.city", "city")
                .setProjection(pl)
                .add(Restrictions.eq("address.myJoinTable.city",
                        session.load(City.class, myId)))
                .add(Restrictions
                        .sqlRestriction("SELECT (
                                                 {alias}.id * {alias}.code * " 
                                                 + mynumber1 + " * " + mynumber2 + ") 
                                                  as number from city 
                                                  HAVING number < 10")
                .setResultTransformer(
                        new AliasToBeanResultTransformer(Store.class))
                .list();

【问题讨论】:

    标签: mysql hibernate hibernate-criteria


    【解决方案1】:

    如果你只需要传递一个值,你可以使用 public static Criterion sqlRestriction(String sql, Object value, Type type)。对多个值使用 public static Criterion sqlRestriction(String sql, Object[] values, Type[] types)

    例如:

    Type[] tipos = {IntegerType.INSTANCE, IntegerType.INSTANCE};
    Integer[] values = {1, 2};
    
    criteria.add(Restrictions.sqlRestriction("SELECT ({alias}.id * {alias}.code * ? * ?) AS number FROM city HAVING number < 10", values, tipos ));
    

    【讨论】:

    • {alias}之后的属性是camelCase还是snake_case? {alias}.accountId{alias}.account_id?
    • 它将是snakeCase(或与您的数据库中的相同),如果它仍然可以帮助某人:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多