Quellcode durchsuchen

修复获取船公司列表SQL语法错误

## 问题分析
在BusCustomerCompanyBusinessRepository中,searchShippingCompaniesWithPage方法使用了JPA的构造函数语法(new com.lianda.backend.dto.CustomerCompanyBusinessSearchResult(...)),但是标记了nativeQuery = true。原生SQL不支持JPA的构造函数语法,导致SQL语法错误。

## 修复方案
1. 修改Repository查询:将返回类型从CustomerCompanyBusinessSearchResult改为Object[]
2. 修改Service方法:在CommonDataService中手动从Object[]数组中提取字段并创建DTO

## 修改文件
- BusCustomerCompanyBusinessRepository.java:修改查询返回类型
- CommonDataService.java:修改数据处理逻辑
heyiwen vor 1 Woche
Ursprung
Commit
d91afb792e

+ 8 - 6
JavaBackend/src/main/java/com/lianda/backend/repository/BusCustomerCompanyBusinessRepository.java

@@ -51,8 +51,7 @@ public interface BusCustomerCompanyBusinessRepository extends JpaRepository<BusC
      * 根据查询词搜索符合条件的客户公司业务 - 通过联合查询
      * 查找CustomerType=2(船公司)且RecordStatus=1的记录,并支持模糊搜索
      */
-    @Query(value = "SELECT new com.lianda.backend.dto.CustomerCompanyBusinessSearchResult(" +
-           "ccb.CustomerCompanyBusinessId, cc.Name, ccb.BusinessCode) " +
+    @Query(value = "SELECT ccb.CustomerCompanyBusinessID, cc.Name, ccb.BusinessCode " +
            "FROM Bus_CustomerCompanyBusiness ccb " +
            "INNER JOIN Bus_CustomerCompany cc ON ccb.CustomerCompanyID = cc.CustomerCompanyID " +
            "INNER JOIN Bus_Customer_CustomerType cct ON cc.CustomerCompanyID = cct.CustomerID " +
@@ -60,10 +59,13 @@ public interface BusCustomerCompanyBusinessRepository extends JpaRepository<BusC
            "AND ccb.RecordStatus = 1 " +
            "AND cc.RecordStatus = 1 " +
            "AND (COALESCE(:query, '') = '' OR LOWER(ccb.BusinessCode) LIKE CONCAT('%', LOWER(:query), '%') OR LOWER(cc.Name) LIKE CONCAT('%', LOWER(:query), '%'))", nativeQuery = true)
-    List<CustomerCompanyBusinessSearchResult> searchShippingCompanies(@Param("query") String query);
+    List<Object[]> searchShippingCompanies(@Param("query") String query);
     
-    @Query(value = "SELECT new com.lianda.backend.dto.CustomerCompanyBusinessSearchResult(" +
-           "ccb.CustomerCompanyBusinessId, cc.Name, ccb.BusinessCode) " +
+    /**
+     * 根据查询词搜索符合条件的客户公司业务 - 分页查询
+     * 查找CustomerType=2(船公司)且RecordStatus=1的记录,并支持模糊搜索
+     */
+    @Query(value = "SELECT ccb.CustomerCompanyBusinessID, cc.Name, ccb.BusinessCode " +
            "FROM Bus_CustomerCompanyBusiness ccb " +
            "INNER JOIN Bus_CustomerCompany cc ON ccb.CustomerCompanyID = cc.CustomerCompanyID " +
            "INNER JOIN Bus_Customer_CustomerType cct ON cc.CustomerCompanyID = cct.CustomerID " +
@@ -71,5 +73,5 @@ public interface BusCustomerCompanyBusinessRepository extends JpaRepository<BusC
            "AND ccb.RecordStatus = 1 " +
            "AND cc.RecordStatus = 1 " +
            "AND (COALESCE(:query, '') = '' OR LOWER(ccb.BusinessCode) LIKE CONCAT('%', LOWER(:query), '%') OR LOWER(cc.Name) LIKE CONCAT('%', LOWER(:query), '%'))", nativeQuery = true)
-    Page<CustomerCompanyBusinessSearchResult> searchShippingCompaniesWithPage(@Param("query") String query, Pageable pageable);
+    Page<Object[]> searchShippingCompaniesWithPage(@Param("query") String query, Pageable pageable);
 }

+ 14 - 9
JavaBackend/src/main/java/com/lianda/backend/service/CommonDataService.java

@@ -216,17 +216,22 @@ public class CommonDataService {
     @DataSource(value = RoutingDataSourceConfig.DataSourceType.BRANCH)
     @Transactional(readOnly = true)
     public Page<ShippingCompanyDTO> searchShippingCompanies(String companyName, Pageable pageable) {
-        Page<CustomerCompanyBusinessSearchResult> results = busCustomerCompanyBusinessRepository.searchShippingCompaniesWithPage(companyName, pageable);
+        Page<Object[]> results = busCustomerCompanyBusinessRepository.searchShippingCompaniesWithPage(companyName, pageable);
         
         List<ShippingCompanyDTO> dtos = results.getContent().stream()
-            .map(result -> new ShippingCompanyDTO(
-                result.getCustomerCompanyBusinessID(),
-                result.getCustomerName(),
-                result.getBusinessCode(),
-                null,
-                null,
-                null
-            ))
+            .map(result -> {
+                String customerCompanyBusinessID = (String) result[0];
+                String customerName = (String) result[1];
+                String businessCode = (String) result[2];
+                return new ShippingCompanyDTO(
+                    customerCompanyBusinessID,
+                    customerName,
+                    businessCode,
+                    null,
+                    null,
+                    null
+                );
+            })
             .collect(Collectors.toList());
         
         return new org.springframework.data.domain.PageImpl<>(dtos, pageable, results.getTotalElements());