我正在开发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);
}
dao是
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)
答案 0 :(得分:1)
此问题实际上来自数据库级别。由于FetchType.EAGER
中有@OneToMany
,因此Hibenate会生成带有联接的查询,这会生成DEPUTES_APPEAL
DeputeAppealFiles
和FetchType.EAGER
。这就是为什么你多次获得相同的实体。
要解决此问题,您可以:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
<!Doctype html>
<html lang="en">
<head>
<!--libraries -->
<script type=text/javascript src="jquery.js"></script>
<script type=text/javascript src="bootstrap/js/bootstrap.min.js"></script>
<link href="bootstrap/css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<link href="bootstrap/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css">
<link href="stylesheet.css" rel="stylesheet" type="text/css">
<link href="animate.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- JS Code -->
<script type="text/javascript">
$(document).ready(function() {
$('dropdown-toggle').dropdown()
});
</script>
<title>BSMUN'17 </title>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<!-- Header -->
<header style="margin: 0 auto" class="animated fadeIn">
<div class="header animated" align="middle">
<img src="bsmun-logo.png" id="logo-header" class="logo animated fadeInUp" align="middle">
<div class="header-text animated fadeInUp">
<h1 class="animated fadeIn">BSMUN'17</h1>
<h2 class="animated fadeIn">27-29 July</h2>
</div>
</div>
<ul class="nav" id="nav1"></ul>
</header>
<!-- JS Scripts -->
<script src="jquery.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
P.S。您的问题标题与您的实际问题无关。