处理其余 Web 服务 url 中单个查询参数的多个值并使用休眠条件处理它们

Npa*_*Npa 3 java rest web-services hibernate criteria

我有一个休息 Web 服务,它会接受“名称”并使用此名称从数据库中获取令牌并将令牌返回。其余网络服务的网址为:

http://localhost:8080/NameService/Tokens?name=Bob
Run Code Online (Sandbox Code Playgroud)

在 serviceLayer 中,我的方法如下:

@GET
@Path("Tokens")
@Produces("application/xml")
public JAXBElement<GetToken> getokenByName(@QueryParam("name") final String name ) {

    if(name!=null){
        // use hibernate criteria to fetch the records from db
        Criteria crit = getSession().createCriteria(getPersistentClass());
        crit.add(Restrictions.eq("name",name))
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当客户端可以在请求中同时发送多个名称时,我们的需求发生了变化。例如,给我令牌 where name = "bob" or "brendon" or "aaron" 的 URL 可能是这样的:

http://localhost:8080/NameService/Tokens?name=Bob,Aaron,Brendon
Run Code Online (Sandbox Code Playgroud)

发送的姓名数量是可变的。它可以是 1 或 2 或 3,依此类推。关于如何通过调整上面显示的代码来实现这种拆分并将它们作为服务层中的 OR 条件传递给休眠条件的任何想法,这适用于一个名称?

一种方法可能是StringUtils使用分隔符(逗号)解析不同的名称,然后形成一个列表以及如何将列表中的名称添加到条件限制中。但不确定这是否有效。

有任何想法吗?

Ale*_*lex 5

事实上,最简单的方法是使用split(",").

您还可以将查询参数设置为 aList<String>并传递如下参数:

http://localhost:8080/NameService/Tokens?name=Bob&name=Aaron&name=Brendon
Run Code Online (Sandbox Code Playgroud)

或者您也可以实现自己的StringReaderProvider并将其注册到球衣。

对于您的评论:您应该使用析取。

@GET
@Path("Tokens")
@Produces("application/xml")
public JAXBElement<GetToken> getokenByName(@QueryParam("name") final String names) {
    if (names != null) {
        Criteria crit = getSession().createCriteria(getPersistentClass());
        Disjunction disjunction = Restrictions.disjunction(); 
        for (String name: names.split(",")) {
            disjunction = disjunction.add(Restrictions.eq("name", name));
        } 
        crit.add(disjunction);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)