0

特定のユーザーに関連するすべての患者を返そうとしていますが、日付を返そうとすると、適切なコンストラクターがないというエラーが表示されます。これは患者クラスです:

    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 + "]";
    }





}

これはクエリです(休止状態)

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

1 に答える 1

1

この問題はHibernateの問題ではなく、Effective Java (2nd Edition)に記載されているように、実際にはJavaの問題です。

Java プラットフォーム ライブラリには、インスタンス化可能なクラスを拡張して値コンポーネントを追加するクラスがいくつかあります。たとえば、java.sql.Timestamp は java.util.Date を拡張し、ナノ秒フィールドを追加します。Timestamp の equals 実装は対称性に違反しており、Timestamp オブジェクトと Date オブジェクトが同じコレクションで使用されている場合、またはその他の方法で混在している場合、不安定な動作を引き起こす可能性があります。Timestamp クラスには、日付とタイムスタンプを混在させないようにプログラマーに警告する免責事項があります。それらを別々にしておく限り問題に陥ることはありませんが、それらを混在させることを妨げるものは何もなく、結果として生じるエラーはデバッグが困難になる可能性があります. Timestamp クラスのこの動作は誤りであり、エミュレートすべきではありません。(ブロッホ、Effective Java、第 2 版)

クラスには何がありますUsersか?java.sql.Timestampコードのどこでも使用していれば、問題はありません。

于 2013-08-03T21:02:42.727 に答える