如何将Json数组传递给IN运算符的JPQL Where子句?

时间:2017-07-22 08:54:26

标签: javascript java mysql hibernate jpa

我有一个多下拉选择框可供选择类型列表。我正在JavaScript中创建一个JSON数组,其中包含用户选择的所有类型。将它们传递给后端Java函数以绘制图形。

Database : MySQL

JavaScript的:

var items = {};

    $(function() {
        $('#genres1').change(function() {
            console.log($(this).val());
            items.genres = $(this).val();
        }).multipleSelect({
            width: '56%'
        });
    });

    var genres = items.genres.map(function(e){
              return JSON.stringify(e);
            });
        var selectedGenres = genres.join(", ");
        alert(selectedGenres); // Outputs : "Action", "Horror" and so on.... based on selection

爪哇:

public static void myFun(String genre){
            Logger.info("Genre"+genre); //prints "Action","Horror"
            List<String> selectedGenres = Arrays.asList(genre);
            //List<String> selectedGenres = Arrays.asList("Action","Horror"); //Correct output
            Logger.info("Genre"+selectedGenres); //prints ["Action","Horror"]
            String queryString="SELECT wD FROM sed WHERE genre IN (:genres)";
            Query query1=JPA.em().createNativeQuery(queryString).setParameter("genres", selectedGenres);
}

我不知道如何将数组传递给查询。

//List<String> selectedGenres = Arrays.asList("Action","Horror"); //Correct output

这个硬编码值给了我正确的输出。当我传递“selectedGenres”数组时,包含与上面输入完全相同的内容 - "Action","Horror"我没有得到首选输出。我也尝试发送“类型”作为参数,但它不起作用。我得到空洞的回应。有人能在我出错的地方纠正我吗?

1 个答案:

答案 0 :(得分:1)

List<String> selectedGenres = Arrays.asList(genre);

一些API澄清:Arrays#asList接受String... vargs,其中每个参数都是创建实际List的元素值。

回到你的方法:你的输入参数是String genre一个字符串),而#asList方法不知道这个genre字符串实际上是一个数组(并且不应该),并且它正确地完成其工作 - 在收到单个元素(在我们的例子中为String)时,会创建一个单独的List

要解决此问题,您可能需要尝试其中一个选项:

  1. (如果您的字符串是JSON数组)使用JSON解析库(例如Jackson
  2. 尝试用逗号分割输入(genre),然后将该数组转换回List。