Java 如何使用列表<;字符串>;限制中的params.like

Java 如何使用列表<;字符串>;限制中的params.like,java,spring,hibernate,criteria,dropwizard,Java,Spring,Hibernate,Criteria,Dropwizard,我在限制中使用列表对象。在方法中,现在我必须在限制中使用这个案例。比如 但是限制。例如不接收列表参数。我怎样才能解决这个问题? 我的代码如下: public void设置电话(设置电话){ this.phones.addAll(电话); 如果(!this.phones.isEmpty()){ 添加(新的QueryAlias(“profile”,“profile”)); 添加(限制,比如(“profile.phone”,this.phones)); } } 更正我以前(现在已编辑)的答案 根据文档

我在
限制中使用
列表
对象。在
方法中,现在我必须在
限制中使用这个案例。比如
但是
限制。例如
不接收
列表
参数。我怎样才能解决这个问题? 我的代码如下:

public void设置电话(设置电话){
this.phones.addAll(电话);
如果(!this.phones.isEmpty()){
添加(新的QueryAlias(“profile”,“profile”));
添加(限制,比如(“profile.phone”,this.phones));
}
}

更正我以前(现在已编辑)的答案

根据文档()的说明,似乎您没有直接的方法来实现这一点

您可以尝试迭代列表,然后为您的每部手机创建一个列表,然后将此列表转换为数组以用于:

public void设置电话(设置电话){
this.phones.addAll(电话);
如果(!this.phones.isEmpty()){
//创建一个列表来存储标准
List criterionsPhoneNumbers=new ArrayList();
//对于搜索到的每个数字,它都会创建一个标准,并在criterionsPhoneNumbers列表中添加一个“相似限制”。
//注意匹配模式(在原始sql中,使用%phoneNumber%将是一个“like”-检查hibernate生成的sql)。
//您可以根据自己的需要更改此选项。
用于(字符串编号:数字){
添加(新的QueryAlias(“profile”,“profile”));
criterionsPhoneNumbers.add(限制,如(“number”、number、MatchMode.ANYWHERE));
}
//此处criterionsPhoneNumbers被转换为数组,然后添加到带有“或限制”的条件中
添加(Restrictions.or(criterionsPhoneNumbers.toArray)(新标准[restrictionsPhoneNumbers.size()));
}
}
我之前的回答是错误的,因为添加每个电话号码作为限制。like(only)是不够的,它被转换为带有逻辑'and'in'where'子句的sql。因为我没有测试,所以我看不到错误。 我已经实现了,然后我看到了错误。

我的道歉。

更正我先前(现在已编辑)的答案

根据文档()的说明,似乎您没有直接的方法来实现这一点

您可以尝试迭代列表,然后为您的每部手机创建一个列表,然后将此列表转换为数组以用于:

public void设置电话(设置电话){
this.phones.addAll(电话);
如果(!this.phones.isEmpty()){
//创建一个列表来存储标准
List criterionsPhoneNumbers=new ArrayList();
//对于搜索到的每个数字,它都会创建一个标准,并在criterionsPhoneNumbers列表中添加一个“相似限制”。
//注意匹配模式(在原始sql中,使用%phoneNumber%将是一个“like”-检查hibernate生成的sql)。
//您可以根据自己的需要更改此选项。
用于(字符串编号:数字){
添加(新的QueryAlias(“profile”,“profile”));
criterionsPhoneNumbers.add(限制,如(“number”、number、MatchMode.ANYWHERE));
}
//此处criterionsPhoneNumbers被转换为数组,然后添加到带有“或限制”的条件中
添加(Restrictions.or(criterionsPhoneNumbers.toArray)(新标准[restrictionsPhoneNumbers.size()));
}
}
我之前的回答是错误的,因为添加每个电话号码作为限制。like(only)是不够的,它被转换为带有逻辑'and'in'where'子句的sql。因为我没有测试,所以我看不到错误。 我已经实现了,然后我看到了错误。

很抱歉。

您能发布已抛出的错误/异常吗?Jorge Duarte,没有任何错误,但也没有预期的结果。我已经实现了,现在它可以工作了。我的示例的实现可以在Hi@ShavkatTurakulov上找到。因为这个答案对你有帮助和作用,你能接受吗?@JorgeDuarteI。我还没有测试它,但我相信它会起作用。当我测试时,没有这一行:
criteria.add(Restrictions.or(criterionsPhoneNumbers.toArray)(新标准[restrictionsPhoneNumbers.size()))你能发布已经抛出的错误/异常吗?Jorge Duarte,没有任何错误,但也没有预期的结果。我已经实现了,现在它可以工作了。我的示例的实现可以在Hi@ShavkatTurakulov上找到。因为这个答案对你有帮助和作用,你能接受吗?@JorgeDuarteI。我还没有测试它,但我相信它会起作用。当我测试时,没有这一行:
criteria.add(Restrictions.or(criterionsPhoneNumbers.toArray)(新标准[restrictionsPhoneNumbers.size()))
public void setPhones(Set<String> phones) {

    this.phones.addAll(phones);

    if (!this.phones.isEmpty()) {
        // Creates a list to store criterions
        List<Criterion> criterionsPhoneNumbers = new ArrayList<>();

        // For each number searched, it creates a criterion with a "Like Restriction" adding to criterionsPhoneNumbers List. 
        // Pay attention to match mode (in raw sql it'll be a "like" using %phoneNumber% - check the generated SQL by hibernate).
        // You can change this to suit your needs.
        for (String number : numbers) {
            aliases.add(new QueryAlias("profile", "profile"));
            criterionsPhoneNumbers.add( Restrictions.like("number", number, MatchMode.ANYWHERE)  ) ;
        }

        // Here criterionsPhoneNumbers is being converted to array then added to the criteria with "Or Restriction" 
        criteria.add(Restrictions.or( criterionsPhoneNumbers.toArray(new Criterion[restrictionsPhoneNumbers.size()]) ));
    }


}