簡體   English   中英

添加'...在哪里<column>在(選擇<column>從<div id="text_translate"><p>是否可以使用 Hibernate 5.3+ CriteriaBuilder 添加嵌套的 SELECT IN 語句?</p><p> 我想使用標准生成器創建以下 SQL :</p><pre class="lang-sql prettyprint-override"> select * from ORDERS where sender='ABC' and receiver='DEF' and amount='500' and id IN (SELECT id FROM cc4.best_orders)</pre><p> 標准定義(cc4.best_orders 是一個簡單的 sql 視圖):</p><pre class="lang-java prettyprint-override"> public class BestOrders implements Criterion { private static final String SQL_CRITERIA = ".id IN (SELECT id FROM cc4.best_orders) "; @Override public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) { return new TypedValue[] {}; } @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) { return criteriaQuery.getSQLAlias(criteria) + SQL_CRITERIA; } }</pre><p> 客戶來電:</p><pre class="lang-java prettyprint-override"> //...Old deprecated working way Criteria crit = getSession().createCriteria(Order.class); crit.add(getRestriction("sender.id", sender)); crit.add(getRestriction("receiver.id", receiver)); crit.add(getRestriction("amount.id", dataType)); crit.add(new BestOrders()); crit.setReadOnly(true); Order order = (Order) crit.uniqueResult(); //...New Hibernate 5.3+ way CriteriaBuilder cb = getSession().getCriteriaBuilder(); CriteriaQuery&lt;Order&gt; cr = cb.createQuery(Order.class); Root&lt;Order&gt; root = cr.from(Order.class); cr.select(root).where( cb.and( getEqualPredicate(root, cb, "sender.id", sender), getEqualPredicate(root, cb, "receiver.id", receiver), getEqualPredicate(root, cb, "amount.id", dataType) //new BestOrders() ----&gt; how to add 'SELECT IN' here?; ) ). Query&lt;Order&gt; query = getSession();createQuery(cr). Order order = query;uniqueResult();</pre></div>)' 到 Hibernate 5.3+ CriteriaBuilder<table> </table></column></column>

[英]Adding '...where <column> in (select <column> from <table>)' to Hibernate 5.3+ CriteriaBuilder

是否可以使用 Hibernate 5.3+ CriteriaBuilder 添加嵌套的 SELECT IN 語句?

我想使用標准生成器創建以下 SQL :

select * from ORDERS where sender='ABC' and receiver='DEF' and amount='500' and id IN (SELECT id FROM cc4.best_orders)

標准定義(cc4.best_orders 是一個簡單的 sql 視圖):

public class BestOrders implements Criterion {

private static final String SQL_CRITERIA =
            ".id IN (SELECT id FROM cc4.best_orders) ";

    @Override
    public TypedValue[] getTypedValues(Criteria criteria,
            CriteriaQuery criteriaQuery) {
        return new TypedValue[] {};
    }

    @Override
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
        return criteriaQuery.getSQLAlias(criteria) + SQL_CRITERIA;
    }

}

客戶來電:


//...Old deprecated working way

Criteria crit = getSession().createCriteria(Order.class);
crit.add(getRestriction("sender.id", sender));
crit.add(getRestriction("receiver.id", receiver));
crit.add(getRestriction("amount.id", dataType));
crit.add(new BestOrders());
crit.setReadOnly(true);
Order order = (Order) crit.uniqueResult();

//...New Hibernate 5.3+ way 

CriteriaBuilder cb = getSession().getCriteriaBuilder();
CriteriaQuery<Order> cr = cb.createQuery(Order.class);
Root<Order> root = cr.from(Order.class);
cr.select(root).where(
   cb.and(
         getEqualPredicate(root, cb, "sender.id", sender),
         getEqualPredicate(root, cb, "receiver.id", receiver),
         getEqualPredicate(root, cb, "amount.id", dataType)

        //new BestOrders()   ----> how to add 'SELECT IN' here ?!

        )
   );
Query<Order> query = getSession().createQuery(cr);
Order order = query.uniqueResult();

吃完所有可能的 JPA 手冊后,我找到了正確的方法(使用 JPA 子查詢功能):


CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();

CriteriaQuery<Order> orderCriteriaQuery = cb.createQuery(Order.class);
Root<Order> orderRoot = orderCriteriaQuery.from(Order.class);

Subquery<String> bestOrdersSubQuery = orderCriteriaQuery.subquery(String.class);
Root<BestOrders> bestOrdersRoot = bestOrdersSubQuery.from(BestOrders.class);
bestOrdersSubQuery.select(bestOrdersRoot.get("id"));

orderCriteriaQuery.select(orderRoot).where(
        cb.and(
            getEqualPredicate(cb, orderRoot.get("sender").get("id"), sender),
            getEqualPredicate(cb, orderRoot.get("receiver").get("id"), receiver),
            getEqualPredicate(cb, orderRoot.get("amount").get("id"), dataType),
            orderRoot.get("id").in(
                    bestOrdersSubQuery
            )
        )
);
TypedQuery<Order> query = getEntityManager().createQuery(orderCriteriaQuery);
Order orderConfig = query.getSingleResult();

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM