OrmLite:用连接分组 Where 子句

Suk*_*oft 5 java sqlite android ormlite

我在我的 Android 应用程序中使用 ORMLite,它使用数据库来创建/更新/删除对象。我有以下表结构:

餐酒

  • 国家(自己的表/道)
  • 酒厂(自有桌/道)
  • 评论
  • 购买地点
  • 还有一些与此无关的列

我在做什么(只有关键部分):

In Words:我想显示所有 Wines,其中某些字段与用户输入匹配,但尊重与常量相关的 wine-type。

准备连接查询生成器:

queryBuilderWinery.where().like("name", "%Value%");
queryBuilderCountry.where().like("name", "%Value%");

queryBuilderWine
.join(queryBuilderWinery)
.join(queryBuilderCountry)
.where().like("name", "%Value%")
.or().like("purchasePlace", "%Value%").and().eq("wine_type_id", 1)
Run Code Online (Sandbox Code Playgroud)

生产:

FROM wine
INNER JOIN winery
   ON wine.winery_id = winery.id
INNER JOIN country
   ON wine.country_id = country.id
WHERE ((wine.name LIKE '%in%' OR wine.comment2 LIKE '%in%') AND wine.wine_type_id = 1)
OR (winery.winery_name LIKE '%in%')
OR (country.country_name LIKE '%in%')
Run Code Online (Sandbox Code Playgroud)

需要的 where 子句:

WHERE (wine.comment like '%Value%' OR 
        wine.purchasePlace like '%Value%' OR 
        winery.name like '%Value%' OR 
        country.name like '%Value%') 
    AND wine.wine_type_id = 1

or 

WHERE  wine.wine_type_id = 1
    AND (wine.comment like '%Value%' OR 
        wine.purchasePlace like '%Value%' OR 
        winery.name like '%Value%' OR 
        country.name like '%Value%') 
Run Code Online (Sandbox Code Playgroud)

我的问题是,这能做到吗?我已经阅读了关于此的文档,我知道可以使用 RPN(反向波兰表示法)或创建带有组的 where 子句,但我不确定如何正确地对 where 子句进行分组,因为所有连接都将有一个 OR 子句作为好吧,我需要将 AND 子句分开分组。如果我使用 Where 分组,这是否也会影响连接条件?

任何帮助表示赞赏。

更新: 我尝试了一个原始的 Where 子句,但这里有同样的问题,我无法想象一种方法,我可以将 WhereClause 分组到多个表上......

WineDAO wineDAO = new DatabaseHelperProvider().get(this).getWineDAO();
CountryDAO countryDAO = new DatabaseHelperProvider().get(this).getCountryDAO();
WineryDAO wineryDAO = new DatabaseHelperProvider().get(this).getWineryDAO();

QueryBuilder<Wine, Long> wineQueryBuilder = wineDAO.queryBuilder();
wineQueryBuilder = wineQueryBuilder.join(countryDAO.queryBuilder()).join(wineryDAO.queryBuilder());

Where<Wine, Long> where = wineQueryBuilder.where().raw("(winery.name = ? OR country.name = ?) AND wine_type_id = ?",
        new SelectArg("winery.name", "in"),
        new SelectArg("country.name", "in"),
        new SelectArg("wine_type_id", 1));

String prepStatement = wineQueryBuilder.prepareStatementString();
List<Wine> query = where.query();
int i = query.size();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为该列winery.name显然不包含在表中wine......