JPA查询:枚举列表在枚举列表中

时间:2017-11-15 16:54:09

标签: java jpa enums

我有一个搜索条件对象,其中包含一个枚举列表。

搜索结果还有一个枚举列表。

我希望能够找到包含搜索条件中列出的所有枚举的搜索结果。

我尝试了以下但是得到了

  

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);

1 个答案:

答案 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();