来自DB的返回值是多个

时间:2016-09-03 07:15:25

标签: java spring hibernate spring-mvc arraylist

我正在开发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)

1 个答案:

答案 0 :(得分:1)

此问题实际上来自数据库级别。由于FetchType.EAGER中有@OneToMany,因此Hibenate会生成带有联接的查询,这会生成DEPUTES_APPEAL DeputeAppealFilesFetchType.EAGER。这就是为什么你多次获得相同的实体。

要解决此问题,您可以:

  1. 删除criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  2. 使用结果转换器<!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>
  3. P.S。您的问题标题与您的实际问题无关。