1

関連テーブルから単一の列を選択しようとしています。多くの値を持つテーブル (アイテム) があります。Value.valueString を選択したいと思います。

基本的に、クエリは一連の値を渡し、それらの値を含む ValueFields を取得することになっています。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)」と言うとき、それは正しいですか?

4

1 に答える 1

0

私は問題を見つけました:

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

StockItem.itemNumber ではなく StockItem ID に基づいて参加していました

Itemvalues マップの結合の問題を解決するために 2 つのクエリを使用しました (32,000 以上の結果が返されました)。

于 2012-09-13T18:51:03.210 に答える