简体   繁体   English

时间戳休眠

[英]Timestamp hibernate

I try to return all the patients related to a particular user everything works but when I try to return the date i receive the error that I have no appropriate constructor. 我尝试返回与特定用户有关的所有患者,但一切正常,但是当我尝试返回日期时,出现错误,提示我没有适当的构造函数。 this is the patient class: 这是患者类别:

    package com.objects;

import java.io.Serializable;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.cfg.Configuration;
import org.hibernate.envers.reader.FirstLevelCache;

import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "patient", uniqueConstraints = {
        @UniqueConstraint(columnNames = "paitentFirstName"),
        @UniqueConstraint(columnNames = "paitentLastName") })

public class Patient implements Serializable {

    @Id
    @Column(name="id")
    private int id;
    private String paitentFirstName;
    private String paitentLastName;
    private Timestamp dateOfbirth;
    private String sex;



    @ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER)
        @JoinTable(name="User_Patient", 
                    joinColumns={@JoinColumn(name="id")}, 
                    inverseJoinColumns={@JoinColumn(name="userName")})
        private Set<User> users = new HashSet<User>();



     @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.patient", cascade=CascadeType.ALL)
      private Set<JoinDrugPatient> JoinDrugPatient = new HashSet<JoinDrugPatient>(0);


     public Patient(int id, String paitentFirstName, String paitentLastName,
             Timestamp dateOfbirth,String sex) {
        this.id = id;
        this.paitentFirstName = paitentFirstName;
        this.paitentLastName = paitentLastName;
        this.dateOfbirth = dateOfbirth;
        this.sex = sex;
    }


     public Patient(int id, String paitentFirstName,String lastName,String sex){
         this.id = id;
         this.paitentFirstName = paitentFirstName;
         this.paitentLastName=lastName;
         this.sex=sex;
     }
     public Patient(String date){
         paitentFirstName=date;
     }

     public Patient(){}

    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    @Column(name = "paitentFirstName", nullable = false, length = 10)
    public String getPaitentFirstName() {
        return paitentFirstName;
    }


    public void setPaitentFirstName(String paitentFirstName) {
        this.paitentFirstName = paitentFirstName;
    }

    @Column(name = "paitentLastName", nullable = false, length = 10)
    public String getPaitentLastName() {
        return paitentLastName;
    }


    public void setPaitentLastName(String paitentLastName) {
        this.paitentLastName = paitentLastName;
    }


    public Timestamp getDateOfbirth() {
        return dateOfbirth;
    }


    public void setDateOfbirth(Timestamp dateOfbirth) {
        this.dateOfbirth = dateOfbirth;
    }


    public String getSex() {
        return sex;
    }


    public void setSex(String sex) {
        this.sex = sex;
    }


    public Set<User> getUsers() {
        return users;
    }


    public void setUsers(Set<User> users) {
        this.users = users;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.patient", cascade=CascadeType.ALL)
    public Set<JoinDrugPatient> getJoinDrugPatient() {
        return JoinDrugPatient;
    }


    public void setJoinDrugPatient(Set<JoinDrugPatient> joinDrugPatient) {
        JoinDrugPatient = joinDrugPatient;
    }










    public Set<JoinDrugPatient> getStockCategories() {
        return JoinDrugPatient;
    }


    public void setStockCategories(Set<JoinDrugPatient> stockCategories) {
        this.JoinDrugPatient = stockCategories;
    }


    @Override
    public String toString() {
        return "Patient [id=" + id + ", paitentFirstName=" + paitentFirstName
                + ", paitentLastName=" + paitentLastName + ", dateOfbirth="
                + dateOfbirth + ", sex=" + sex + "]";
    }





}

this is the query(hibernate) 这是查询(休眠)

List<Patient> l=session.createQuery("Select new Patient(p.id,p.paitentFirstName,p.paitentLastName,p.dateOfbirth,p.sex)"
                                        +" from Patient p join p.users a where a.UserName=?")
                                        .setParameter(0, userName)
                                        .list();

This issue is not a Hibernate issue it is truly a Java issue as is stated in Effective Java (2nd Edition) . 该问题不是Hibernate问题,它确实是有效Java(第二版)中所述的Java问题。

There are some classes in the Java platform libraries that do extend an instantiable class and add a value component. Java平台库中有一些类可以扩展可实例化的类并添加值组件。 For example, java.sql.Timestamp extends java.util.Date and adds a nanoseconds field. 例如,java.sql.Timestamp扩展了java.util.Date并添加了一个纳秒字段。 The equals implementation for Timestamp does violate symmetry and can cause erratic behavior if Timestamp and Date objects are used in the same collection or are otherwise intermixed. 如果在同一集合中使用了Timestamp和Date对象,或者将它们混合在一起,则Timestamp的equals实现确实违反了对称性,并且可能导致不稳定的行为。 The Timestamp class has a disclaimer cautioning programmers against mixing dates and timestamps. Timestamp类有免责声明,警告程序员不要混用日期和时间戳。 While you won't get into trouble as long as you keep them separate, there's nothing to prevent you from mixing them, and the resulting errors can be hard to debug. 只要将它们分开就不会遇到麻烦,但是没有什么可以阻止您将它们混合使用的,并且由此产生的错误可能很难调试。 This behavior of the Timestamp class was a mistake and should not be emulated. Timestamp类的此行为是一个错误,不应模仿。 (Bloch, Effective Java, 2nd Ed.) (Bloch,有效的Java,第二版。)

What do you have in the class Users ? 您在Users类中有什么? You won't have any problem if you are using java.sql.Timestamp everywhere in your code. 如果在代码中的任何地方都使用java.sql.Timestamp则不会有任何问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM