不区分大小写的查询

11

我有一些可能包含数字和字母混合的票据编号。我将把ticketNumberIds作为参数传递给这个方法(用户输入),我希望它可以查询 Oracle 数据库,并且查询可以区分大小写。

如何使以下查询不区分大小写?

public List<TicketDO> getTicketDOsById(final List<String> ticketNumberIds) {

    String myQuery = "from TicketDO t where t.ticketNumberId in (:ticketNumberIds)";

    return getEntityManager().createQuery(myQuery).setParameter("ticketNumberIds", ticketNumberIds)
    .getResultList();

}
1个回答

28
您可以使用UPPER进行大小写不敏感的查询。
public List<TicketDO> getTicketDOsById(final List<String> ticketNumberIds) {

    String myQuery = "from TicketDO t where UPPER(t.ticketNumberId) in (:ticketNumberIds)";
    List<String> upperNumbers = new ArrayList<String>();
    for (String number : ticketNumberIds) {
        upperNumbers.add(number.toUppercase());
    }
    return getEntityManager().createQuery(myQuery).setParameter("ticketNumberIds", upperNumbers)
    .getResultList();

}

1
这对我不起作用,我正在使用Derby数据库。这可能是由于某种方言差异引起的吗? - Jonas Byström
我也在使用Derby,它运行得很好。能详细说明一下吗? - Jonas Eicher
1
请注意,这可能会在数据库中强制执行表扫描,因此如果您在ticketNumberId上有索引,则可能不会使用它。为避免这个问题,您可以在实体setter中转换为大写,以便在.persist()期间存储所有票号都是大写的。然后,上面的代码中不再需要函数UPPER(),因此该列上的任何索引仍然可用。 - DTs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接