我正在嘗試從表中獲取一些資料并對其執行一些操作。但不知何故,它只是一遍又一遍地回傳一行。
這是我的存盤庫類:
package com.gtt.wcas.device.db.repository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import com.gtt.wcas.device.db.jpa.DeviceDetails;
@Repository
public interface DeviceDetailsRepository extends PagingAndSortingRepository<DeviceDetails, String> {
}
我的物體類是這樣的:
package com.gtt.wcas.device.db.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "DEVICE_DETAILS")
public class DeviceDetails {
@Column(name = "ConnectionType", nullable = false)
private Integer connectionType = -1;
@Column(name = "CustomerGRUA", nullable = false)
private String customerGRUA;
@Id
@Column(name = "DeviceName", nullable = false)
private String deviceName;
@Column(name = "DeviceState", nullable = false)
private Integer deviceState = -1;
@Column(name = "Vendor", nullable = false)
private String vendor;
/**
* Default Constructor
*/
public DeviceDetails() {
}
/**
* @return the connectionType
*/
public Integer getConnectionType() {
return connectionType;
}
/**
* @param connectionType the connectionType to set
*/
public void setConnectionType(Integer connectionType) {
if (connectionType == null) {
this.connectionType = -1;
} else {
this.connectionType = connectionType;
}
}
.
.
.
Other Getters and Setters.
.
.
.
}
我的服務類是這樣的:
package com.gtt.wcas.device.db.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import com.gtt.wcas.device.db.jpa.DeviceDetails;
import com.gtt.wcas.device.db.repository.DeviceDetailsRepository;
@Service("deviceDetailsService")
public class DeviceDetailsService {
Logger logger = LoggerFactory.getLogger(DeviceDetailsService.class.getName());
private DeviceDetailsRepository deviceDetailsRepository;
/**
* Constructor
* @param deviceDetailsRepository
*/
@Autowired
public DeviceDetailsService (DeviceDetailsRepository deviceDetailsRepository) {
this.deviceDetailsRepository = deviceDetailsRepository;
}
/**
* Fetch all the columns in DEVICE_DETAILS table.
* @return List<DeviceDetails>
*/
public List<DeviceDetails> getAllDeviceDetails() {
List<DeviceDetails> deviceDetails = new ArrayList<DeviceDetails>();
logger.debug("Searching for all device in the table.");
Iterable<DeviceDetails> deviceDetailsIterator = deviceDetailsRepository.findAll(Sort.by("customerGRUA"));
deviceDetails = StreamSupport.stream(deviceDetailsIterator.spliterator(), false).collect(Collectors.toList());
logger.debug("Fetched all device in the table.");
return deviceDetails;
}
}
我的控制器類:
@RestController
public class DeviceConnectionController {
@Autowired
@Resource(name = "deviceDetailsService")
DeviceDetailsService deviceDetailsService;
Logger logger = LoggerFactory.getLogger(DeviceConnectionController.class.getName());
@RequestMapping(value = "/deviceConnection", method = RequestMethod.GET)
public ResponseEntity<String> deviceConnection(@RequestParam(value = "verify", defaultValue = "false") String verify, @RequestParam(value = "deviceName") String deviceName) {
boolean verification = Boolean.valueOf(verify);
deviceConnectionDetails = DeviceDetailsDB.getDeviceDetails(deviceName, deviceDetailsService);
.
.
.
}
.
.
.
.
}
最后出現問題的類:
public class DeviceDetailsDB {
/**
* Get details stored for the specified devicename
*
* @param deviceName
* @param deviceDetailsService
*/
public static DeviceConnectionDetails getDeviceDetails(String deviceName, DeviceDetailsService deviceDetailsService) {
DeviceConnectionDetails deviceConnectionDetails = new DeviceConnectionDetails(deviceName);
List<DeviceDetails> deviceDetailsList = deviceDetailsService.getAllDeviceDetails();
for (DeviceDetails deviceDetails : deviceDetailsList) {
System.out.println("Device Details: " deviceDetails.getDeviceName() "\t GRUA: " deviceDetails.getCustomerGRUA());
}
DeviceDetails deviceDetails = deviceDetailsService.getDeviceDetailsbyID(deviceName);
.
.
.
.
}
.
.
.
}
和 application.properties 檔案:
#datasource configurations
spring.datasource.url=THE URL
spring.datasource.username=USERNAME
spring.datasource.password=PASSWORD
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# Enabling H2 Console
spring.h2.console.enabled=true
# Custom H2 Console URL
spring.h2.console.path=/h2-console
spring.jpa.hibernate.ddl-auto=update
# DDL generation
spring.jpa.generate-ddl=true
但是for上面的回圈只是一遍又一遍地只重復一行,而不是列印表中的所有行。該表中有 200 多行。
輸出如下:
Device Details: GRUA: 0070
Device Details: GRUA: 0070
Device Details: GRUA: 0070
Device Details: GRUA: 0070
Device Details: GRUA: 0070
Device Details: GRUA: 0070
.
.
.
.
.
and so on.
是我做錯了什么嗎?我猜它與服務類有一些問題。但是因為這對我來說是第一次,不知道在哪里看。
提前致謝。
uj5u.com熱心網友回復:
我相信 DEVICE_DETAILS 表可能有問題。
根據Entity Class,“DeviceName”是DeviceDetails的主鍵。因此,它在設備中必須是唯一的。我想知道您的資料是否滿足此約束。模式中是否定義了primary key條件?
它應該看起來像這樣:
create table device_details (
connection_type int not null,
customergrua varchar not null,
device_name varchar primary key not null,
device_state int not null,
vendor varchar not null
);
如果設備名稱不是唯一的,您應該選擇另一個主鍵 (@Id) 或創建一個虛擬主鍵。
參考:Spring Data JPA 查詢回傳重復行而不是實際資料,為什么?
uj5u.com熱心網友回復:
請嘗試以如下方式覆寫findAll(Sort S)方法DeviceDetailsRepository:
@Override
List<DeviceDetails> findAll(Sort S);
這樣您就不必在服務類中創建List,Iterable這可能就是問題所在。其余的代碼看起來不錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/493978.html
