2012-09-10 40 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+结果)

相关问题