3

简短的介绍

当数组列表输入为空时,我该如何findBy<Field>In处理。IN例如忽略它。你的 DAO 会是什么样子?

更长的描述。

想象一下,您创建了一个搜索用户页面。

在应用程序中。您有多种过滤选项。

  • 创建(始终给出日期范围)
  • 国家(当为空时忽略并搜索所有国家)
  • 年龄范围
  • 职称
  • ETC...

现在假设您要在国家列表中搜索给定日期范围内的所有用户。

在搜索用户时,我总是会搜索加入的日期,但是如果我没有选择一个国家,我希望它搜索所有国家。

我计划在国家/地区之外添加更多过滤器选项。所以我真的不想为每个可能的字段组合创建很多 findBy 方法。

@Repository
public interface UserDao extends JpaRepository<User, Long> {

    public List<BeatRate> findByCreatedBetweenAndCountryIn(Date from, Date to, ArrayList<String> countryList );

}

测试

@Test
public void test() throws ParseException {

    Date from = new SimpleDateFormat( "yyyy-MM-dd" ).parse( "2015-01-01" );
    Date to   = new SimpleDateFormat("yyyy-MM-dd").parse("2015-05-15");

    //ArrayList<String> countryList = new ArrayList<String>();
    //countryList.add("UK");
    //countryList.add("Australia");
    //countryList.add("Japan");   // works ok when I have a list

    countryList = null;  // I want it to search for all countries when this is null -- this errors and doesnt work..  

    List<BeatRate> beatRates = beatRateDao.findByCreatedBetweenAndRentalCountryIn(from, to, countryList);

    Assert.assertTrue(beatRates.size()>0);

}
4

1 回答 1

0

你可以有两种方法:

beatRateDao.findByCreatedBetweenAndRentalCountryIn(from, to, countryList);

beatRateDao.findByCreatedBetweenAndRental(from, to);

然后只需根据以下内容选择一个countryList

List<BeatRate> beatRates = (countryList != null && !countryList.isEmpty())
    ?  beatRateDao.findByCreatedBetweenAndRentalCountryIn(from, to, countryList)
    : beatRateDao.findByCreatedBetweenAndRental(from, to);

IN 子句需要一个不可为空且非空的参数列表,否则查询将失败。

在 PostgreSQL 上,如果您尝试运行这样的查询:

select * 
from product 
where quantity in ( )

您收到以下错误:

ERROR:  syntax error at or near ")"
LINE 3: where quantity in ( )
                            ^
********** Error **********

ERROR: syntax error at or near ")"
SQL state: 42601
Character: 45
于 2015-03-06T13:42:32.010 回答