Как сделать операцию выбора и удаления в спящем режиме
Ниже мой код имеет отношение "один ко многим" между родителем и учеником. Мое требование:
- Когда я даю студенту
class_name
тогда информация о родителях должна отображаться - Если я введу ссылку
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 поддерживает две формы объединения ассоциаций: неявное и явное.