我正在开发 EComerceDocumentManageSystem,需要一些帮助。我试着解释一下。像这样搜索后我有一个对象列表
List<DeputeAppeal>deputeAppealList = deputeAppealService.individualSearch(deputeAppealForRequestDto);
model.addAttribute("deputeAppealList", deputeAppealList);
服务是
public List<DeputeAppeal> individualSearch(DeputeAppealForRequestDto deputeAppealForRequestDto) {
RequestForDeputeAppealSearch requestForDeputeAppealSearch = new RequestForDeputeAppealSearch();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
java.sql.Date incomeDateForDeputeAppealSQLSearch;
java.sql.Date outDateForDeputeAppealSQLSearch;
if(deputeAppealForRequestDto.getOutDate() == "") {
deputeAppealForRequestDto.setOutDate(null);
} else {
try {
Date outDateForSearch = format.parse(deputeAppealForRequestDto.getOutDate());
outDateForDeputeAppealSQLSearch = new java.sql.Date(outDateForSearch.getTime());
requestForDeputeAppealSearch.setOutDate(outDateForDeputeAppealSQLSearch);
} catch (ParseException e) {
e.printStackTrace();
}
}
if(deputeAppealForRequestDto.getIncomingDate() == "") {
deputeAppealForRequestDto.setIncomingDate(null);
} else {
try {
Date incomingDateForSearch = format.parse(deputeAppealForRequestDto.getIncomingDate());
incomeDateForDeputeAppealSQLSearch = new java.sql.Date(incomingDateForSearch.getTime());
requestForDeputeAppealSearch.setIncomingDate(incomeDateForDeputeAppealSQLSearch);
} catch (ParseException e) {
e.printStackTrace();
}
}
requestForDeputeAppealSearch.setOutNumber(deputeAppealForRequestDto.getOutNumber());
requestForDeputeAppealSearch.setIncomeNumber(deputeAppealForRequestDto.getIncomeNumber());
requestForDeputeAppealSearch.setNameAndAddressOfApplicant(deputeAppealForRequestDto.getNameAndAddressOfApplicant());
requestForDeputeAppealSearch.setNameOfDepute(deputeAppealForRequestDto.getNameOfDepute());
requestForDeputeAppealSearch.setSendingOrganization(deputeAppealForRequestDto.getSendingOrganization());
requestForDeputeAppealSearch.setShortContentOfAppeal(deputeAppealForRequestDto.getShortContentOfAppeal());
requestForDeputeAppealSearch.setMainWorker(deputeAppealForRequestDto.getMainWorker());
requestForDeputeAppealSearch.setTypeOfDeputeAppeal(deputeAppealForRequestDto.getTypeOfDeputeAppeal());
return deputeAppealDao.individualSearch(requestForDeputeAppealSearch);
}
道是
public List<DeputeAppeal> individualSearch(RequestForDeputeAppealSearch deputeAppealForRequest) {
Criteria criteria = sessionDao.getSession().createCriteria(DeputeAppeal.class);
if(!deputeAppealForRequest.getOutNumber().equals("")) {
criteria.add(Restrictions.eq("outNumber", deputeAppealForRequest.getOutNumber()));
}
if(!deputeAppealForRequest.getIncomeNumber().equals("")) {
criteria.add(Restrictions.eq("incomeNumber", deputeAppealForRequest.getIncomeNumber()));
}
if(!deputeAppealForRequest.getNameAndAddressOfApplicant().equals("")) {
criteria.add(Restrictions.like("nameAndAddressOfApplicant", deputeAppealForRequest.getNameAndAddressOfApplicant()));
}
if(!deputeAppealForRequest.getNameOfDepute().equals("")) {
criteria.add(Restrictions.like("nameOfDepute", deputeAppealForRequest.getNameOfDepute()));
}
if(!deputeAppealForRequest.getSendingOrganization().equals("")) {
criteria.add(Restrictions.eq("sendingOrganization", deputeAppealForRequest.getSendingOrganization()));
}
if(deputeAppealForRequest.getOutDate() != null) {
criteria.add(Restrictions.eq("outDate", deputeAppealForRequest.getOutDate()));
}
if(deputeAppealForRequest.getIncomingDate() != null) {
criteria.add(Restrictions.eq("incomingDate", deputeAppealForRequest.getIncomingDate()));
}
if(!deputeAppealForRequest.getShortContentOfAppeal().equals("")) {
criteria.add(Restrictions.like("shortContentOfAppeal", deputeAppealForRequest.getShortContentOfAppeal()));
}
if(deputeAppealForRequest.getTypeOfDeputeAppeal() != null) {
criteria.add(Restrictions.eq("typeOfDeputeAppeal", deputeAppealForRequest.getTypeOfDeputeAppeal()));
}
if(!deputeAppealForRequest.getMainWorker().equals("")) {
criteria.add(Restrictions.eq("mainWorker", deputeAppealForRequest.getMainWorker()));
}
return criteria.list();
}
当我使用这种方法时,搜索一切正常,但它系统有一个属性将文件添加到每个文档。看起来像这样
@RequestMapping(value = "/uploadingPageFileForDeputeAppeal", method = RequestMethod.POST)
public String uploadFile(@RequestParam("file") MultipartFile file,
@RequestParam(value = "id", required = true) int id,
Model model){
LOGGER.debug("Receive request to add file");
if(!file.isEmpty()){
try {
byte [] bytes = file.getBytes();
DeputeAppeal deputeAppeal = deputeAppealService.getById(id);
//Creating the directory to store file
String path = System.getProperty("user.home");
File directory = new File(path + File.separator + "DeputeAppealsFiles" + File.separator + deputeAppeal.getIncomeNumber());
if(!directory.exists())
directory.mkdirs();
// Create the file on server
File serverFile = new File(directory.getAbsolutePath() + File.separator + file.getOriginalFilename());
BufferedOutputStream stream = new BufferedOutputStream(
new FileOutputStream(serverFile));
stream.write(bytes);
stream.close();
DeputeAppealFiles deputeAppealFiles = new DeputeAppealFiles();
deputeAppealFiles.setDeputeAppeal(deputeAppeal);
deputeAppealFiles.setFilePath(serverFile.getAbsolutePath());
deputeAppealFiles.setFileType(file.getContentType());
deputeAppeal.getDeputeAppealFiles().add(deputeAppealFiles);
deputeAppealService.editFilePath(deputeAppealFiles);
model.addAttribute("deputeAppealId", deputeAppeal);
model.addAttribute("fileDirection", deputeAppealFiles.getFilePath());
} catch (Exception e) {
return "You failed to upload " + file.getName() + " => " + e.getMessage();
}
} else {
return "You failed to upload " + file.getName()
+ " because the file was empty.";
}
return "deputeAppealView/addedFile";
}
所以在添加一个文件文档后全部都在搜索中看起来也不错,但是当我向每个文档添加两个文件时,搜索结果页面会显示两个相同的对象,如果添加三个文件,则会显示三个对象。我很困惑,因为我只需要一个对象
以下实体
@Entity
@Table(name = "DEPUTES_APPEAL")
public class DeputeAppeal extends Appeal implements Serializable {
private static final long serialVersionUID = -5527566248002296042L;
@Id
@Column(name = "DeputeAppeal_ID")
@GeneratedValue
private int id;
@Column(name = "TypeOfDeputeAppeal")
private String typeOfDeputeAppeal;
@Column(name = "sendingOrganization")
private String sendingOrganization;
@Column(name = "outNumber")
private String outNumber;
@Column(name = "outDate")
private Date outDate;
@Column(name = "countOfPages")
private String countOfPages;
@Column(name = "nameOfDepute")
private String nameOfDepute;
@Column(name = "incomeNumber")
private String incomeNumber;
@Column(name = "incomingDate")
private Date incomingDate;
@Column(name = "themeOfAppeal")
private String themeOfAppeal;
@Column(name = "shortContentOfAppeal")
private String shortContentOfAppeal;
@Column(name = "unitWhoDoResolution")
private String unitWhoDoResolution;
@Column(name = "contentOfResolution")
private String contentOfResolution;
@Column(name = "checkForPlagiarism")
private String checkForPlagiarism;
@Column(name = "nameAndAddressOfApplicant")
private String nameAndAddressOfApplicant;
@Column(name = "dateForCheck")
private Date dateForCheck;
@Column(name = "mainWorker")
private String mainWorker;
@Column(name = "secondaryWorkers")
private String secondaryWorkers;
@Column(name = "statusOfWorking")
private String statusOfWorking;
@Column(name = "result")
private String result;
@OneToMany(mappedBy = "deputeAppeal", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<DeputeAppealFiles> deputeAppealFiles = new ArrayList<DeputeAppealFiles>();
和
@Entity
@Table(name = "DeputeAppealFiles")
public class DeputeAppealFiles implements Serializable {
private static final long serialVersionUID = -5227566248002296042L;
@Id
@Column(name = "DeputeAppealFiles_ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int deputeAppealFilesId;
@Column(name = "FilePath")
private String filePath;
@Column(name = "FileType")
private String fileType;
@ManyToOne
@JoinColumn(name = "DeputeAppeal_ID")
private DeputeAppeal deputeAppeal;
有人可以帮忙吗?我迷失在java中了)
最佳答案
这个问题实际上来自于DB层面。由于您的 @OneToMany
中有 FetchType.EAGER
,Hibenate 会使用 join 生成查询,从而生成 cartesian product DEPUTES_APPEAL
和 DeputeAppealFiles
。这就是为什么您多次获得相同实体的原因。
要解决此问题,您可以:
- 删除
FetchType.EAGER
- 使用结果转换器
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
附注您的问题标题与您的实际问题不相关。
关于java - DB返回值是多个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39304304/