2016-09-12 15 views
1

我有一个Object1类,它有一个名为tags的long的列表。我有另一个名为tagsToSearch的longs列表。我如何构建使用CQEngine一个查询,如下:CQEngine在子句中使用MultiValueNullableAttribute

Select * from Object1 Where tags in (tagsToSearch) 

如果有谁知道如何做到这一点看使用CQEngine请让我知道。

回答

0

这应该做的伎俩:

package com.googlecode.cqengine; 
import com.googlecode.cqengine.attribute.*; 
import com.googlecode.cqengine.query.Query; 
import com.googlecode.cqengine.query.option.QueryOptions; 
import com.googlecode.cqengine.query.parser.sql.SQLParser; 
import java.util.*; 

import static com.googlecode.cqengine.codegen.AttributeBytecodeGenerator.*; 
import static com.googlecode.cqengine.query.QueryFactory.*; 
import static java.util.Arrays.asList; 

public class TagsExample { 

    static class MyObject { 
     final String name; 
     final List<Long> tags; 

     public MyObject(String name, List<Long> tags) { 
      this.name = name; 
      this.tags = tags; 
     } 

     static final Attribute<MyObject, Long> TAGS = new MultiValueAttribute<MyObject, Long>("tags") { 
      public Iterable<Long> getValues(MyObject object, QueryOptions queryOptions) { return object.tags; } 
     }; 
    } 

    public static void main(String[] args) { 
     IndexedCollection<MyObject> collection = new ConcurrentIndexedCollection<>(); 
     collection.add(new MyObject("foo", asList(1L, 2L, 3L))); 
     collection.add(new MyObject("bar", asList(4L, 5L, 6L))); 
     collection.add(new MyObject("baz", asList(7L, 8L, 9L))); 

     // Search via a programmatic query... 
     Query<MyObject> nativeQuery = in(MyObject.TAGS, asList(3L, 9L)); 
     collection.retrieve(nativeQuery) 
       .forEach(object -> System.out.println(object.name)); 
     // ..prints: foo, baz 


     // Search via an SQL query... 
     String sqlQuery = "SELECT * FROM collection WHERE tags IN (3, 9)"; 
     SQLParser<MyObject> parser = SQLParser.forPojoWithAttributes(MyObject.class, createAttributes(MyObject.class)); 
     parser.retrieve(collection, sqlQuery) 
       .forEach(object -> System.out.println(object.name)); 
     // ..prints: foo, baz 
    } 
} 
+0

我会给一个镜头,感谢您的快速回复。无论如何要表示这是一个正常的SQL查询。我有一堆存储为SQL的其他查询,并且我可以对此进行异常处理,但如果我不这样做会更好。 – Nath5

+0

是的,没问题。我已经更新了答案,以显示如何在SQL中执行操作。 – npgall