【问题标题】:How do I do a drop-down list without duplicate elements?如何做一个没有重复元素的下拉列表?
【发布时间】:2018-10-30 11:08:46
【问题描述】:

我有一个对象列表和多个下拉列表。我想显示列表中的数据。但我的问题是我不想拥有这样的东西:

例如:我不想在下拉文件名中出现两次:

文件 1 文件 1 文件2 文件 3 文件 3

我只想拥有:file1, file2, file3

这是我将列表放入模型的控制器

@GetMapping("/filter/functionality/misramessages")
public String filterFunctionality(Model model) {
    model.addAttribute("misraMessages", misraMessagesService.findAllMisraMessagesFromDb());
    return "functionality";
}

在 html 之后我这样做:

 <!-- Filter File Name-->
        <div class="form-group row">
            <label for="fileName" class="col-sm-2 col-form-label">File Name</label>
            <div class="col-sm-10">
                <select class="form-control"  name="file_name" id="fileName">
                    <option th:value="0" text="Please Select"></option>
                    <option  th:each = "misra : ${misraMessages}"
                             th:value="${misra.fileName}"
                             th:text="${misra.fileName}">
                    </option>
                </select>
            </div>
        </div>

<!-- Filter Message Number-->
        <div class="form-group row">
            <label for="messageNumber" class="col-sm-2 col-form-label">Message Number</label>
            <div class="col-sm-10">
                <select class="form-control"  name="message_number" id="messageNumber">
                    <option th:value="0" text="Please Select"></option>
                    <option  th:each = "misra : ${misraMessages}"
                             th:value="${misra.messageNumber}"
                             th:text="${misra.messageNumber}">
                    </option>
                </select>
            </div>
        </div>
        .......
        .......

【问题讨论】:

  • 有几种方法可以消除重复。您甚至可以尝试在数据库查询中消除它们,可能使用DISTINCT 关键字。您也可以使用 Java 在方法 misraMessagesService.findAllMisraMessagesFromDb() 中消除它们。你喜欢哪个?该方法看起来如何?
  • 很简单:@Override public List findAllMisraMessagesFromDb() { return misraMessagesRepository.findAll(); }
  • 然后看看数据库查询。您应该能够消除那里的重复项。请参阅下面给出的答案。

标签: java spring spring-mvc spring-boot thymeleaf


【解决方案1】:

我希望misraMessagesService.findAllMisraMessagesFromDb() 正在返回字符串列表。因此,如果您不想更改 findAllMisraMessagesFromDb() 方法,可以这样做:

List<String> messages = misraMessagesService.findAllMisraMessagesFromDb();
Set<String> uniqueMsgs = new HashSet<String>(messages);

或者你也可以在misraMessagesRepository中创建一个新方法:

@Query("SELECT DISTINCT name FROM MisraMessages")
public List<MisraMessages> findDistinctMisraMessagesFromDb();

两者中的任何一个都可以。

【讨论】:

    【解决方案2】:

    永远不要使用 JAVA 方式来做同样的事情,因为它只是双倍的处理时间。

    我会避免在 Java 级别代码中进行处理,因为查询级别很容易做到这一点。

    只需使用 Select distinct 关键字,它就像一个魅力..!!

    保持简单。

    【讨论】:

      【解决方案3】:

      如果这会导致问题并且需要删除重复项,最好不要将重复项带入内存。

      因此,您需要在该存储库中编写一个返回 DISTINCT 结果并在 DAO 中使用该方法的新方法,而不是使用存储库方法 - misraMessagesRepository.findAll();

      @Query("SELECT DISTINCT * FROM MESSAGES_TABLE" , nativeQuery = true)
      List<MisraMessages> findDistinctMessages();
      

      您没有显示您的存储库,所以我使用了虚拟表名。如果仍然感到困惑并需要更好的答案,请显示您的存储库代码和实体详细信息。

      【讨论】:

      • 我确实像你告诉我的那样,但我收到了这个错误:Validation failed for query for public abstract java.util.List com.cidashboard.repositories.MisraMessagesRepository.findDistinctMessages()!
      • 我需要用 @NamedNativeQuery(name = ... ) 注释实体?
      • @Alexandra :我用nativeQuery = true 更新了答案。试试看。
      【解决方案4】:

      将您的列表转换为集合。它将删除您的重复项,然后放入模型中。

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 2019-08-11
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        相关资源
        最近更新 更多