我有一个搜索条件对象,其中包含一个枚举列表。
搜索结果还有一个枚举列表。
我希望能够找到包含搜索条件中列出的所有枚举的搜索结果。
我尝试了以下但是得到了
IllegalArugmentException参数值[ENUM_VALUE_X] 与预期类型java.util.Collection(n / a)
不匹配
我觉得我在某个地方犯了一个愚蠢的错误但却无法弄清楚它是什么。我做错了什么?
<Route
path={'Content/:id'}
component={DrillPage}
/>
class DrillPage extends Component {
componentDidMount() {
this.props.actions.getLoggedInUser();
}
componentWillReceiveProps(nextProps) {
console.log(this.props);
console.log(nextProps);
// Don't fire if user isn't logged in
if (this.props.loggedInUser.id !== nextProps.loggedInUser.id) {
this.props.actions.isFavourite(this.props.content.id, this.props.content.type);
this.props.actions.doIFollow([this.props.content.author.id]);
}
}
}
function mapStateToProps(state, ownProps) {
return {
contentId: ownProps.params.id,
loggedInUser: state.loggedInUser,
};
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(Object.assign({}, contentActions, userActions), dispatch),
};
}
export default connect(mapStateToProps, mapDispatchToProps)(DrillPage);
答案 0 :(得分:0)
这是解决这个问题的一种相当丑陋的方法(虽然它100%有效):
List<SomeEnum> enumList = criteria.getEnumsList();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < enumList.size(); i++) {
if (i == 0) {
sb.append("WHERE :e").append(i).append(" MEMBER OF result.enumsList");
} else {
sb.append(" AND ").append(":e").append(i).append(" MEMBER OF result.enumsList");
}
}
Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result "+ sb.toString(), SearchResult.class);
for (int i = 0; i < enumList.size(); i++) {
query.setParameter("e" + i, enumList.get(i));
}
List<SearchResult> resultList = query.getResultList();
这是一个zyexal的建议,虽然匹配一个出现并检查列表的长度,但也可以。因此,分隔符的例外是可能的:
Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result JOIN result.enumsList e WHERE e IN :enums GROUP BY result HAVING COUNT(distinct e) = :enumsSize", SearchResult.class);
query.setParameter("enums", criteria.getEnumsList());
query.setParameter("enumsSize", criteria.getEnumsList().size());
List<SearchResult> resultList = query.getResultList();