2012-09-10 64 views
1

我想從相關表中選擇一列。我有一個包含許多值的表格(Item)。我想選擇Value.valueString。Java Criteria API:從一對多關係表中選擇單列

基本上,查詢應該傳入一堆值並拉出包含這些值的任何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)」時,是否正確?

+0

您需要一個元組:http://stackoverflow.com/questions/3842122/complex-queries-with-jpa-criteria-builder –

+0

但我只選擇一個值。不是多重選擇的元組? – dmoss18

+0

@ a.drew.b OP不需要元組,OP可以使用IN操作實現這一點。 'select .. from ... where value IN:collection'。我可以舉個例子,但我不想弄清楚這些實體是如何映射的。 OP請顯示實體如何相關(類)。 – siebz0r

回答

0

我發現這個問題:

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

我是根據入世對StockItem ID而不是StockItem.itemNumber

我用了兩個查詢,解決加盟Itemvalues地圖的問題(這是返回32,000+結果)

相關問題