如何构建一个从关系中引用实体的谓词?

Posted

技术标签:

【中文标题】如何构建一个从关系中引用实体的谓词?【英文标题】:How to build a predicate which references an entity from a relationship? 【发布时间】:2012-11-27 00:44:36 【问题描述】:

我需要用一个与另一个实体有关系的实体与另一个实体建立一个谓词。这可能吗?我有以下实体:

Entity: BOOK
Entity: AUTOR
Entity: SCHOOL

还有这些关系:

BOOK -> relationAutor <- AUTOR
AUTOR -> relationSchool <- SCHOOL
SCHOOL -> attribute "country"

所以,我需要从特定的country 过滤/获取一些书籍。因为我通过实体 AUTOR 从实体 BOOK 到属性 country(来自实体 SCHOOL)有一些关系,所以我尝试连接这个谓词:

NSString *pred = [[NSPredicate predicateWithFormat:@"relationAutor.relationSchool.country IN %@",[countries valueForKey:@"country"]]predicateFormat];
predicateFormat = [predicateFormat stringByAppendingFormat:@" AND (%@)",pred];

但是我的代码崩溃了:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (relationAutor.relationSchool.country IN France)'

我正在尝试做的事情是否可能?如果是,我将如何构建这样的谓词?

【问题讨论】:

【参考方案1】:

您不能通过字符串连接来组合谓词。如果您需要一个谓词,它是 2 个(或更多)其他谓词的“AND”组合,请使用 NSCompoundPredicate,例如

NSArray *countries = @[@"France"]; 
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"relationAutor.relationSchool.country IN %@", countries];
NSPredicate *pred2 = ... // other predicate

// pred = pred1 AND pred2:
NSPredicate *pred = [NSCompoundPredicate andPredicateWithSubpredicates:@[pred1, pred2]];

另请参阅predicateFormat 的文档:

此方法返回的字符串不保证与 用于使用 predicateWithFormat: 等创建谓词的字符串。 您不能使用此方法创建一个持久性表示 可以用来重新创建原始谓词的谓词。

【讨论】:

实际上,我正在组合另一个谓词,一切都很好。我其他的谓词很简单,只有一个关系,但是这个谓词,有2个关系,代码崩溃 @user1600801:您的代码是否崩溃或我建议的代码? - 我已经用更多信息更新了我的答案。如果您展示如何创建和组合谓词的完整代码,会更容易提供帮助。

以上是关于如何构建一个从关系中引用实体的谓词?的主要内容,如果未能解决你的问题,请参考以下文章

使用谓词查询核心数据

如何使用 BooleanBuilder (QueryDSL) 为可选的 OnetoOne JPA/Hibernate 关系建模谓词?

NSFetchRequest 具有一对一关系属性 == YES 谓词错误地获取每个实体

一对多关系的CoreData谓词

核心数据获取请求关系属性谓词

使用 NSFetchedResultsController 的子实体到父实体的谓词