当前位置: 首页 > 知识库问答 >
问题:

如何将Hibernate“create alias”子限制添加到父实体限制中

拓拔嘉颖
2023-03-14

我有一个要求,我需要将搜索关键字应用于父实体(客户)的名称和状态,以及子实体 Order 的名称属性。

List<Criterion> aliasRestrictionsCriterion = new ArrayList<Criterion>();
Junction quotedLikeRestrictions = Restrictions.disjunction();
quotedLikeRestrictions.add(Restrictions.ilike("customerName", token, MatchMode.ANYWHERE));
quotedLikeRestrictions.add(Restrictions.ilike("customerState", token, MatchMode.ANYWHERE));
restrictions.add(quotedLikeRestrictions);

并在查询中包含子表,我正在执行以下操作

Criteria alias = criteria.createAlias("order", "order")
.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE));

Hibernate正在生成下面的查询,但是我需要的是将order.name之类的比较添加到父块中。

CUSTOMER this_ inner join ORDER order_ on this_.ORDER_ID=order_.ORDER_ID where 
(lcase(this_.name) like ? or lcase(this_.state) like ?) and (lcase(order_.NAME) 
like ?)        

我想要的是(lcase(order_.NAME)像?)在父块内。所以我想要的是以下内容

(this_名称)像? 或大小写(this_.状态) 像 ? 或大小写 (order_.名称) 像 ?)

我如何才能做到这一点?

更新:这就是我调用标准的方式

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) {
    Session session = currentSession();
    Criteria criteria = session.createCriteria(getEntityClass());

    // apply restrictions.
    if (restrictions != null) {
        for (Criterion criterion : restrictions) {
            criteria.add(criterion);
        }
    }

    Criteria alias = criteria.createAlias("order", "order").add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE));

    List list = criteria.list();
    if (list != null) {
        return list;
    }
    return html" target="_blank">Collections.emptyList();
}

更新2:

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) {
    Session session = currentSession();
    Criteria criteria = session.createCriteria(getEntityClass());

    Junction or = Restrictions.disjunction();
    or.add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE));
    criteria.createAlias("order", "order").add(or);


    // apply restrictions.
    if (restrictions != null) {
        for (Criterion criterion : restrictions) {
            criteria.add(criterion);
        }
    }

    List list = criteria.list();
    if (list != null) {
        return list;
    }
    return Collections.emptyList();
}

生产选择....从客户this_内部连接 this_ 上的订单order_。ORDER_ID=order_.uid 哪里(order_.名称)喜欢?)和(this_名称)喜欢?或大小写(this_状态)喜欢?

orderName就在前面,但仍不在第二个or语句中...我好迷茫。

共有1个答案

梁豪
2023-03-14

好吧,除了将限制添加到Criteria(创建AND)之外,您必须将其添加到quotedLikeRestrtions析取:

quotedLikeRestrictions.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE));
 类似资料:
  • 我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。

  • 我有一个叫做com的方法。ACM软件。共享。AbstractDerrivedBean。getDerivedUniqueId()。当我JProfiler应用程序时,这个方法getDerivedUniqueId()实际上像预期的那样埋在了80个方法的深处。该方法代表应用程序中的每个bean调用。我试图记录CPU调用树,从这个方法开始,一直记录到叶节点(即,被排除的类之一)。 我尝试了以下方法,但没有达

  • 问题内容: 我知道这个问题已经发布了很多次,但是我想询问详细信息, 使用Oracle,您不能向IN子句传递1000个以上的参数,因此,将hibernate与oracle结合使用可以解决此问题,例如: 1-对于每个1000个参数列表,在IN子句之间使用OR子句,但这不适用,因为oracle的另一个限制是整个查询参数不超过2000 2-使用for循环,每次以1000个参数列表的形式运行查询,然后附加所

  • 问题内容: 好了,下面的查询: 可以使用Criteria进行以下操作: 但在此返回List中每个元素的where是and是。 但是如何使用Criteria执行以下SQL: 换句话说,我想给我一个,我不在乎。我尝试使用代替,但结果是相同的,并且Projection不允许您指定实体,而只能指定属性。 问题答案: 您可以根据条件使用。 现在,您检索所有急切加载的产品的订单。

  • 我有以下情况: 我想把所有动物都放在动物桌上。但是当我加载它们时,我想说它们是在哪个子类中加载的。在这种情况下,动物在理论上是抽象的。 这样的事情可能吗: 问题是,否则我看不出有任何可能从装载的动物投射到猫。:( 我用的是Hibernate4.2

  • 问题内容: 我有如下表 如何通过下面的AND组合成一个IN语句来使用Restriction.in查询? 问题答案: 我认为这是您要使用的条件组合(顺便说一句,帮助Hibernate实体bean定义而不是表结构更容易):