java - DB返回值是多个

标签 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);
    }

道是

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_APPEALDeputeAppealFiles。这就是为什么您多次获得相同实体的原因。

要解决此问题,您可以:

  1. 删除FetchType.EAGER
  2. 使用结果转换器criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

附注您的问题标题与您的实际问题不相关。

关于java - DB返回值是多个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39304304/

相关文章:

java - 如何使用 Hibernate 连接两个表的字段?

Java - 方法等于和更多可能的字母

java - 设置一个按钮

java - Spring集成Kafka

java - 使用 Spring AOP 时,在单个连接点上绑定(bind)参数的多个 around 建议会导致错误

java - Spring HibernateDaoSupport 创建多个 session

Java:GUI 必须在 EDT 线程中初始化?

java - HTTP 状态 415 - 使用 Ajax 将 Json 数据发布到 Spring MVC 4 还使用了 Spring Security

java - 启动端点之前的 Spring run 方法

java - hibernate 和准备好的语句