【问题标题】:How to search by field value in Spring Data REST without use the UUID?如何在不使用 UUID 的情况下在 Spring Data REST 中按字段值进行搜索?
【发布时间】:2016-03-22 11:04:31
【问题描述】:

我是第一次使用Spring Data REST,我是这项技术的新手。

我有这种情况:

  • 一个展示公司和产品的网络应用
  • 每家公司都可以拥有一种或多种产品

我的基本实现似乎运行良好。

当我转到网址时:https ://localhost:8881/my-project/api/companies

我有这个结果:

{
  "_embedded" : {
    "companies" : [ {
      "companyName" : "Company_Name",
      "companyId" : "1234",
      "_links" : {
        "self" : {
          "href" : "https: //localhost:8881/my-project/api/companies/015d8038-96dc-42cb-94af-1ab49158150f"
        },
        "company" : {
          "href" : "https: //localhost:8881/my-project/api/companies/015d8038-96dc-42cb-94af-1ab49158150f{?projection}",
          "templated" : true
        },
        "products" : {
          "href" : "https: //localhost:8881/my-project/api/companies/015d8038-96dc-42cb-94af-1ab49158150f/products"
        }
      }
    }, 

如果我转到 URL: https ://localhost:8881/my-project/api/companies/015d8038-96dc-42cb-94af-1ab49158150f/products

我获得了那家公司的所有产品。 这是正确的,但我想在不使用 URL 中的UUID 的情况下获得相同的结果,例如:https ://localhost:8881/my-project/api/companies/Company_Name/products

下面是我对公司存储库的实际实现:

public interface CompanyBaseRepository extends PagingAndSortingRepository<Company, UUID>{

}

这是产品存储库:

public interface ProductBaseRepository extends PagingAndSortingRepository<Product, UUID>{

}

应该使用什么实现来完成这项任务?

谢谢。

【问题讨论】:

  • 你的意思是不使用 uuid 你想使用公司名称?
  • 没错,我想使用公司名称而不是 uuid 访问。
  • 首先你确定公司名称永远是唯一的吗?
  • 是的,公司名称永远是唯一的
  • 客户端不应该(!)构建链接,而只使用收到的链接。因此,如果您不发送包含名称的链接,客户如何知道它们?为什么要发送包含名称的链接?

标签: spring java-8 spring-data-rest


【解决方案1】:

在 spring 文档中 [这里][1] http://docs.spring.io/spring-data/data-commons/docs/1.7.x/reference/html/repositories.html

请参阅第 1.3.1 节向单个存储库添加自定义行为 基本上你想要的是制作一个自定义接口,制作一个实现这个接口并做你想做的事的类。并使您的 ProductBaseRepository 也扩展它。所以可能你想要:

1)创建接口ProductCustomRepository(这里创建方法查找产品为公司名称) 2)创建实现上述接口的类ProductCustomRepositoryImpl(这里实现查找产品为公司名称的方法)。 3) 让您的 ProductBaseRepository 也扩展 ProductCustomRepository。

如果您需要更多信息,我会添加更多详细信息,但这很容易,我认为您可以毫无问题地进行管理。

【讨论】:

  • 谢谢现在,我会开始考虑这个想法!
【解决方案2】:

我找到了另一种方法。

我在 CompanyBaseRepository 中添加了一个按名称公开搜索的方法:

public interface CompanyBaseRepository extends CrudRepository<Company, UUID>{

    @RestResource(path="byName", rel="byName")
    Company findByCompanyName(@Param("company") String companyName);

    @RestResource(path="byId", rel="byId")
    Company findByCompanyId(@Param("company") String companyId);

}

结果可在 URL 中获得: https://localhost:8881/my-project/api/companies/search/byId?company=9 或者: https://localhost:8881/my-project/api/companies/search/byName?company=test

谢谢大家!

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2011-04-28
    • 2018-07-25
    相关资源
    最近更新 更多