2016-09-03 4 views
0

私はEComerceDocumentManageSystemを開発しており、何か助けが必要です。私は説明しようとする。私はこのDBからの戻り値は複数です

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(); 
    } 

私はすべてが検索のために正常に動作します。このメソッドを使用していますが、それシステムがされています各文書にファイルを追加するプロパティがあります。私は結果ページを検索、各文書に2つのファイルを追加していたときので、すべての検索で1つのファイルのドキュメントを追加した後、この

@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"; 
    } 

のように見えることは3つのファイルを追加していた場合、私にそれを2と同じオブジェクトを示しあまりにもよさそうだけど3つのオブジェクトを表示します。私は

@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; 

以下

エンティティは、誰かが助けることができる1つのオブジェクトのみを必要とするので、私は、混乱のですか?私はjavaで失われています)

答えて

1

この問題は、実際にDBレベルから来ています。 FetchType.EAGER@OneToManyにあるため、Hibenateはjoinを使用してクエリを生成し、とDEPUTES_APPEALDeputeAppealFilesを生成します。そのため、同じエンティティーを複数回取得するのはこのためです。

  1. FetchType.EAGER
  2. 使用結果トランスcriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

P.S.を削除します。

のいずれかのことができます。これを修正するには質問のタイトルはあなたの実際の質問には関係しません。

+0

私はFetchType.EAGERを削除しようとしていますが、ドキュメントをファイルに追加するときに次の問題が発生する: 'com.oleg.project.domain.Appeal.DeputeAppeal.deputeAppealFilesを初期化できませんでした。 Session.jsp –

+0

この問題は元の問題とは無関係で、特定のエラーメッセージの最初の5つのGoogle検索結果を調べることで解決できます。これはすべてSOにつながります。 – chimmi

+0

私はあなたが最初にお勧めし、すべて正常に動作する、私の問題は "セッションなし"を使用して解決する@Transactional注釈 –