Sprint Data Rest是否支持开箱即用的列查询?

时间:2019-04-15 15:25:43

标签: rest jpa spring-data-rest

我有一个使用Spring Data Rest和JPA的非常简单的示例,该示例公开了人员资源。启动应用程序时,它可以按预期工作,并且我可以发布和获取资源实例。

针对/ person发送GET时,会收到以下响应:

    "_embedded": {
        "person": [
            {
                "firstName": "FN",
                "lastName": "LN",
                "_links": {
                    "self": {
                        "href": "http://localhost:9090/person/1"
                    },
                    "person": {
                        "href": "http://localhost:9090/person/1"
                    },
                    "address": {
                        "href": "http://localhost:9090/person/1/address"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:9090/person{?page,size,sort}",
            "templated": true
        },
        "profile": {
            "href": "http://localhost:9090/profile/person"
        },
        "search": {
            "href": "http://localhost:9090/person/search"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
    }
}

您可以看到人员资源具有一个FN值的firstName属性。

我的问题是,以下GET查询是否可以立即使用?

/ person?firstName = FN

或者这需要使用自定义搜索方法来实现吗?

不用说它对我不起作用,但是我看到关于是否已开箱即用的信息存在冲突。

预先感谢

1 个答案:

答案 0 :(得分:0)

  

我的问题是,以下GET查询是否可以立即使用?

不。您将收到类似

的错误
{
"cause": {
"cause": null,
"message": "For input string: \"findByName\""
},
"message": "Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'findByName'; nested exception is java.lang.NumberFormatException: For input string: \"findByName\""
}

Spring Data Rest具有以下URL结构。 / {pluralEntityName} / {primaryKey},例如,当实体名称为Person且主键为Long时,它将为/ persons / 1

我们看到此错误消息,因为Spring Date Rest尝试将实体名称后的第二个参数转换为该实体的主键。在我的Person实体中,主键为Long,因此它将尝试将findByName转换为Long并失败。

  

或者这需要使用自定义搜索方法来实现吗?

是的,如果要在存储库中进行搜索,则需要按照Spring Data JPA的方法名称约定在存储库中编写一个方法,然后Spring Data JPA会自动将该方法转换为SQL查询,而Spring Data Rest将自动将此方法公开为端点。

例如,如果您编写如下方法:     列出findByNameContains(String name);

该方法将在Spring Data Rest中公开,您将能够从以下端点访问它:     http://localhost:8080/persons/search/findByNameContains?name=Mahsum

顺便说一句,您可以通过访问http://localhost:8080/persons/search

查看所有可用的搜索方法