Java Criteria API: выберите один столбец из таблицы отношений «один ко многим»

Я пытаюсь выбрать один столбец из связанной таблицы. У меня есть таблица (элемент) со многими значениями. Я хотел бы выбрать Value.valueString.

По сути, предполагается, что запрос передает кучу значений и извлекает любые поля ValueField, которые содержат эти значения. SQL может выглядеть примерно так:

select ItemValues.valueString from ItemEntity
    join StockItem on ItemEntity.stockItemId = StockItem.id
    join ItemValues on ItemEntity.id = ItemValues.itemId
where StockItem.vendor = vendorId 
AND (ItemValues.valueString like '%test%' OR ItemValues.valueString like '%test2%'...);

Вот мой код:

        final CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
        final CriteriaQuery<String> query = builder.createQuery(String.class);

        final Root<ItemEntity> root = query.from(ItemEntity.class);

        query.select(root.join("ItemValues").<String>get("ValueString"));

        final List<Predicate> filters = new LinkedList<Predicate>();

        filters.add(builder.equal(root.join("StockItem").get("id"), vendorNumber));
        final List<Predicate> filterNamesCriteria = new LinkedList<Predicate>();

        if (filenames.length > 0) {

            for (String fileName : filenames) {
                filterNamesCriteria.add(builder.like(root.join("ItemValues").<String>get("ValueString"), fileName));
            }
            filters.add(builder.or(filterNamesCriteria.toArray(new Predicate[0])));
        }

        query.where(filters.toArray(new Predicate[0]));

        final TypedQuery<String> resolvedQuery = this.entityManager.createQuery(query);

        return resolvedQuery.getResultList();

Я хочу, чтобы результат возвращал список строк (столбец valueString), но он ничего не возвращает.

Я делаю что-то неправильно? Когда я говорю «builder.createQuery(String.class)», это правильно?


person dmoss18    schedule 10.09.2012    source источник
comment
Вам нужен кортеж: stackoverflow.com/questions /3842122/   -  person a.drew.b    schedule 11.09.2012
comment
Но я выбираю только одно значение. Разве это не кортеж для множественного выбора?   -  person dmoss18    schedule 11.09.2012
comment
@ a.drew.b OP не нужен кортеж, OP может добиться этого с помощью операции IN. select .. from ... where value IN :collection. Я мог бы привести пример, но мне не хочется выяснять, как сопоставляются сущности. ОП, пожалуйста, покажи, как связаны сущности (классы).   -  person siebz0r    schedule 11.09.2012
comment
У элемента много ItemValues ​​У элемента есть один StockItem Я не могу выполнить операцию IN, потому что ItemValues.valueString может содержать несколько конкатенированных значений (например, значение1; значение2; значение3, хранящееся в виде строки, разделенной точкой с запятой). Так что я должен сделать (НАПРИМЕР 'foo' ИЛИ ​​НРАВИТСЯ 'bar' ИЛИ ​​НРАВИТСЯ 'fubar')   -  person dmoss18    schedule 11.09.2012


Ответы (1)


Я нашел проблему:

filters.add(builder.equal(root.join("StockItem").get("id"), vendorNumber));

Я присоединялся на основе идентификатора StockItem, а не StockItem.itemNumber

Я использовал два запроса, чтобы решить проблему присоединения к карте Itemvalues ​​(она возвращала более 32 000 результатов).

person dmoss18    schedule 13.09.2012