Как сделать операцию выбора и удаления в спящем режиме

Ниже мой код имеет отношение "один ко многим" между родителем и учеником. Мое требование:

  1. Когда я даю студенту class_name тогда информация о родителях должна отображаться
  2. Если я введу ссылку id родитель, чтобы удалить, то соответствующий потомок этого родителя должен быть удален

Я оставил кодирование в тестовых классах, потому что я не знаю, как написать запрос, чтобы выйти, как пример операции выбора. пожалуйста, дайте мне знать, и если есть какие-либо ошибки в классах DTO

select запрос операции:

select  pt.P_MOBILE,pt.P_EMAIL,st.S_FIRSTNAME,st.REF_ID  
from parent_info pt join student_info st on pt.REF_ID = st.REF_ID 
where st.S_CLASS_TO_JOIN= ?;

Родительский класс:

@Table(name = "parent_info")
public class ParentDTO {
    @Id
    @GenericGenerator(name = "j", strategy = "increment")
    @GeneratedValue(generator = "j")
    @Column(name = "P_ID")
    private int p_id;

    @Column(name = "P_NAME")
    private String p_name;

    @Column(name = "P_PHONE")
    private String p_phone;

    @Column(name = "P_EMAIL")
    private String p_email;

    @Column(name = "REF_ID")
    private String ref_id;

    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="parent_id")

    private List<StudentDTO> students;

    //getters and setters

}

Студенческий класс:

@Table(name = "student_info")
public class StudentDTO {
    @Id
    @GenericGenerator(name = "j", strategy = "increment")
    @GeneratedValue(generator = "j")
    @Column(name = "S_ID")
    private int s_id;

    @Column(name = "S_NAME")
    private String s_name;

    @Column(name = "S_PHONE")
    private String s_phone;

    @Column(name = "S_EMAIL")
    private String s_email;

    @Column(name = "REF_ID")
    private String ref_id;

    @Column(name = "S_CLASS_NAME")
    private String s_class_name;        

    @ManyToOne
    @JoinColumn(name="parent_id")
    private ParentDTO parent;           

    //getters and settrs    
}

Тестовый класс для выбора запроса: попробовал это сейчас: неожиданный токен: th рядом со строкой 1, столбец 90 [выберите s из com.pradeepdemo.StudentDTO для получения соединения s.parent, где s.s_class_name = 10th]

public class Test {
public static void main(String[] args) {
    Session session = null;
    Transaction tx = null;
    List<StudentDTO> groupList = null;
    try {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();         
        Query query = session.createQuery("select s from StudentDTO s join fetch s.parent  where s.s_class_name = 10th");
        groupList = query.list();           
        session.getTransaction().commit();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    } finally {
        session.close();
    }

}

}

Тестовый класс для удаления запроса:

public class Test {
    public static void main(String[] args) {
        Session session = null;
        Transaction tx = null;

        try {
            SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
            session = sessionFactory.openSession();
            session.beginTransaction();    
            session.getTransaction().commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            session.close();
        }
    }
}

3 ответа

Вы можете аннотировать свои классы моделей с помощью @Entity, все должно уладиться. Предполагается, что Hibernate самостоятельно выполняет базовые операции CRUD без написания HQL.

http://www.tutorialspoint.com/hibernate/hibernate_annotations.htm

Рабочий код

Первое сопоставление между двумя объектами, как показано ниже

родитель

 @Entity
    @Table(name="PARENT")
    public class ParentDTO {
        @Id
        @GeneratedValue
        @Column(name="ID")
        private Long parentId;

        @Column(name="firstname")
        private String parentName;  

        @Column(name="ParentPhone")
        private Long parentPhone;

        @Column(name="ParentEMail")
        private String parentEMail;


        @Column(name="ReferenceID")
        private String referenceID;


        @OneToOne(mappedBy="parent", cascade=CascadeType.ALL)
        private Student student;


        public ParentDTO() {

        }


        public ParentDTO(Long parentId, String parentName, Long parentPhone,
                String parentEMail, String referenceID, Student student) {
            super();
            this.parentId = parentId;
            this.parentName = parentName;
            this.parentPhone = parentPhone;
            this.parentEMail = parentEMail;
            this.referenceID = referenceID;
            this.student = student;
        }
        //getters and setters   
    }

Ученик

@Entity
@Table(name = "STUDENT")
public class StudentDTO {
    @Id
    @Column(name="ID", unique=true, nullable=false)
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="parent"))

    private Long id;


    @Column(name = "StudentName")
    private String studentName;

    @Column(name = "StudentClass")
    private int studentClass;

    @Column(name = "ReferenceID")
    private String referenceID;


    @OneToOne
    @PrimaryKeyJoinColumn
    private ParentDTO parent;


    public Student() {

    }


    public Student(Long id, String studentName, int studentClass,
            String referenceID, ParentDTO parent) {
        super();
        this.id = id;
        this.studentName = studentName;
        this.studentClass = studentClass;
        this.referenceID = referenceID;
        this.parent = parent;
    }    
    //getters and setters       
}

Выберите запрос

public void select()
    {
        Session session = null;
        Transaction tx = null;

        try {
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            String hql = "from ParentDTO as p, StudentDTO as s where p.referenceID=s.referenceID and s.referenceID='ReferencID-1'";
            List<?> list = session.createQuery(hql).list();
            for(int i=0; i<list.size(); i++) {
                Object[] row = (Object[]) list.get(i);
                ParentDTO parent = (ParentDTO)row[0];
                Student student = (Student)row[1];
                System.out.println(parent.getParentEMail());
                System.out.println(student.getStudentName());
            }   

            tx.commit();
        } catch (HibernateException he) {
            he.printStackTrace();
            tx.rollback();
        }
    }

Попробуйте прочитать примеры по этой ссылке, чтобы иметь представление о том, как использовать HQL: Hibernate - Примеры запросов и Hibernate Query examples (HQL)

РЕДАКТИРОВАТЬ 1

Как вы можете прочитать в Документах: Формы синтаксиса соединения

HQL поддерживает две формы объединения ассоциаций: неявное и явное.

Другие вопросы по тегам