【问题标题】:Populate a Select dropdown from Query with Spring Thymeleaf使用 Spring Thymeleaf 从 Query 中填充 Select 下拉列表
【发布时间】:2021-09-23 23:21:36
【问题描述】:

我需要从表单的实体(表)属性填充下拉列表映射。由于这些值是静态的(只有 6 个值沿插入值重复),我认为获取这些值的列表并将其发送到 Controller 类并作为带有 Thymeleaf 的 Select 按钮映射到视图中可能是个好主意。

我知道我可以直接从实体中获取属性“状态”值,但我不知道最好的方法

所以,我的问题是:

是否可以从 jpql 查询中填充选择下拉按钮?还有其他更好的方法来填充唯一实体属性吗?

我尝试创建一个像下一个查询一样的查询,以从属于名为“Orders”的实体的属性“Status”获取唯一值,但此查询生成一个没有关联 ID 的列表,只有唯一值(也我想用一个新的临时自动增量 id 列创建一个查询,但没有成功)。

这是我的实体:

@Data
@Entity
@Table(name="orders")
public class Orders implements Serializable {
    @Id
    private Integer orderNumber;
    
    @Column
    private String orderDate;
    
    @Column
    private String requiredDate;
    
    @Column
    private String shippedDate;
    
    @Column
    private String status;
// ...
}
@Repository("ordersDAO")
public interface OrdersDAO extends JpaRepository<Orders,Integer>{
    
    @Query("SELECT DISTINCT o.status FROM orders o")
// 
    @Transactional(readOnly = true)
    public List <Orders> getAllStatus();

从现在开始,我无法解决(无论是控制器还是表单模板)。

更新

我正在尝试这段代码,但它不起作用。让我知道需要改进的错误:

服务实施

public class OrdersServiceImpl implements OrdersService{
 @Override
    public List<Orders> getAllStatus() {
        return ordersDAO.getAllStatus();
    }
}

控制器

@Controller
@Slf4j
public class IndexController {

    String url = "";

    @Autowired
    @Qualifier("ordersServiceImpl")
    private OrdersService ordersService;
    
    @GetMapping("/")
    public String getStatusDropdown(Model model){
        
        List<Orders> statusDropdown = ordersService.getAllStatus();
        model.addAttribute("statusDropdown", statusDropdown);
        return "forms";
    }

HTML 表单

<div class="form-row align-items-center">
   <div th:object="${statusDropdown}" class="col-2 my-1">
      <label for="Estado" class="mr-sm-2">Estado</label>
      <select class="custom-select mr-sm-2" id="Estado" form="ordersForm">
      <option selected>Seleccione Estado</option>
      <option th:each="status : ${statusDropdown}" th:text="${status}" th:value="${status}">Estado 1</option>
      </select>
   </div>

   <div class="col align-self-end my-1">
      <input class="btn btn-info" type="submit" value="Buscar" th:href="@{/getOrdersByStatus}">    
   </div>
</div>

【问题讨论】:

    标签: java spring-boot spring-mvc thymeleaf


    【解决方案1】:

    假设您已经有数据 - 假设您想要显示状态列表(状态)然后

    1. 在控制器中
    model.addAttribute("statuses",statuses);
    
    1. 在百里香中
     <select >
            <option th:each="status:${statuses}"><span th:text=${status}></span></option>
                       
       </select>
    

    无论您发送什么数据,它都会在下拉列表中填充

    【讨论】:

    • 您不应该在&lt;option&gt; 中使用&lt;span&gt;。使用 Thymeleafs &lt;th:block&gt; 或内联表达式:[[ ${status} ]]
    • 也可以这样做-
    • 谢谢大家!我仍然无法映射查询中的值。我会将主题更新为更多信息。
    • 将此粘贴​​到存储库/订单道 - ``` @Query(value = "Select Distinct status From orders", nativeQuery = true) public List getAllStatus(); ```
    • 嗨 Ayush,我有一个类似的查询,没有 nativeQuery,我会尝试,但我认为问题可能出在控制器或 html thymeleaf 表达式中
    【解决方案2】:

    最后,我得到了解决方案(差点忘了贴出来)。 我不得不在几乎所有层中修改多行代码:

    HTML 表单(forms.html):

    <form id="ordersForm" method="POST" form="ordersForm" 
                                          th:action="@{/searchOrders}" 
                                          th:object="${ordersList}">
            <div class="form-row">
                    <div class="col-auto">
                            <label for="Estado">Estado
                            <select class="form-control custom-select" id="status" name="status" form="ordersForm"
                            th:object="${statusDropdown}">
                                    <option selected>Seleccione Estado</option>
                                    <option th:each="status : ${statusDropdown}" 
                                    th:text="${status}" 
                                    th:value="${status}">Estado</option>
                            </select>
                            </label>
                    </div>
            </div>
            <div class="col-auto mr-1">
                    <div>
                            <input class="btn btn-info" type="submit" value="Buscar"/>    
                    </div>
            </div>
    </form>
    

    控制器

    @Controller
    public class IndexController {
    
        String url = "";
    
        @Autowired
        private OrdersService ordersService; 
    
    @GetMapping("/")
    public String getStatusDropdown(Model model){
            List<String> statusDropdown = ordersService.getAllStatus();
            model.addAttribute("statusDropdown", statusDropdown);
        return "forms";
    
    }
    }
    

    服务实施

    @Override
        public List<String> getAllStatus() {
            List<String> statusList = ordersDAO.getAllStatus();
            return statusList;
        }
    

    存储库

    @Repository("ordersDAO")
    public interface OrdersDAO extends JpaRepository<Orders,Integer>{
        
        @Query(value = "SELECT DISTINCT o.status FROM orders o ORDER BY o.status", nativeQuery = true)
        @Transactional(readOnly = true)
        public List<String> getAllStatus();
    

    谢谢大家的建议!

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      相关资源
      最近更新 更多