Критерии запроса соединения Hibernate и получение таблицы соединения с обоими столбцами - PullRequest
0 голосов
/ 25 июля 2011

У меня есть таблица cartitems , в которой хранятся товары, добавленные в корзину. В ней есть столбцы:

id (первичный ключ), sku, количество, userId, статус, размер и пара других столбцов

У меня также есть таблица productAvailability , в которой мы храним уровни инвентаризации и где у меня есть следующие столбцы:

sku, размер, количество, BatchId (первичный ключ)

Также таблица product имеет отношения «один ко многим» с таблицей productAvailability и таблицей cartitems для ключа sku

Теперь для каждого cartitems со статусом = 1 и userId = x нам нужно проверить доступность продукта, и, если доступно, мне нужна строка CartItems и BatchId продукта:

Я добрался до здесь:

 Criteria criteria = session.createCriteria(CartItems.class,"cartitems");
            criteria.add(Restrictions.eq("userId", userId));
            criteria.add(Restrictions.eq("status", status));
            criteria.createAlias("product", "product");
            criteria.createAlias("product.productAvailability", "productavailability");
            criteria.add(Restrictions.eqProperty("productavailability.size", "cartitems.size"));
            criteria.add(Restrictions.geProperty("productavailability.quantity", "cartitems.quantity"));
                    List<CartItems> cartItems =  criteria.list();

Вышеуказанное в основном делает следующее:

select * from cartItems 
    where productAvailability.quantity >= cartitems.quantity and
          productAvailability.size = cartitems.size and
          productAvailability.sku = cartitems.sku and
          cartitems.userId = ? and
          cartitems.status = ?

Таким образом, я не могу получить BatchId. Я попытался использовать JOIN FETCHTYPE, но он все еще загружает таблицу productAvailability со всеми размерами sku. Есть ли способ получить и cartItems и соответствующие BatchIds для каждого из cartItems?

Ответы [ 2 ]

1 голос
/ 25 июля 2011

В вашем примере вы выбираете только элементы из родительского класса, поэтому имеет смысл, что у вас нет доступа к данным дочерней ассоциации.

Вы можете использовать Projections, чтобы выбрать те поля, которые вам нужны (или действительно нужны), а затем использовать ResultTransformer для загрузки JavaBean. В вашем случае я бы расширил ваш класс CartItems полем для хранения BatchId, а затем добавил бы к вашему запросу Criteria следующее:

ProjectionList projections = Projections.projectionList(); 
projections.add(Projections.property("sku"));
projections.add(Projections.property("quantity"));
...etc...
projections.add(Projections.property("productavailability.BatchId", "BatchId"));
criteria.setProjection(projections);
criteria.setResultTransformer(Transformers.aliasToBean(CartItemsTO.class));

Обратите внимание, что вам может понадобиться добавить псевдонимы в поля проекции, чтобы преобразование работало правильно.

0 голосов
/ 25 июля 2011

Поскольку между таблицей CartItem и таблицей productAvailability есть отношение один ко многим. У вас будет набор, или список, или сумка в вашей модели товара в корзине. и отображение будет что-то вроде этого в HBM.

<set name="productAvailabilitySet" table="table_product_availability"
        inverse="true" fetch="select" cascade="save-update" lazy="false">
        <key column="table_availability2cart_item" />
        <one-to-many
    class="com.example.ProductAvailability" />

Теперь ... после броска выше критерия ... вы могли бы на самом деле .. использовать getProductAvailability и выполнять итерации и получать партии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...