Subject.java
Код: Выделить всё
package org.example.bean;
import jakarta.persistence.*;
import jakarta.persistence.Table;
import lombok.Data;
import org.hibernate.annotations.*;
@Entity(name = "subject_entity")
@Table(name = "SUBJECTS",uniqueConstraints = @UniqueConstraint(columnNames = {"subjectName"}))
@Data
@DynamicInsert
@DynamicUpdate
public class Subject {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long subjectId;
String subjectName;
}
Код: Выделить всё
package org.example.bean;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;
@Entity(name="retrievesubject")
@Getter
@Subselect(value="select s.subjectId as sid ,s.subjectName as subname from tbl_subjects s")
@Synchronize(value={"TBL_SUBJECTS"},logical = false)
@Immutable
public class RetrieveSubject {
@Id
Long sid;
String subname;
}
Теперь посмотрите код ниже: -
Код: Выделить всё
package org.example.service;
import jakarta.persistence.*;
import org.example.bean.RetrieveSubject;
import org.example.bean.Subject;
import java.util.List;
import java.util.Scanner;
public class SubjectService {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Subject");
EntityManager entityManager = entityManagerFactory.createEntityManager();
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of subjects:-");
int noofSubjects = sc.nextInt();
sc.nextLine();
String subjectName="";
for(int i=1; i retrieveSubjectList = retrieveSubject.setParameter("id",4).getResultList();
for(RetrieveSubject retrieveSubject1 : retrieveSubjectList)
System.out.println(retrieveSubject1.getSid()+"----"+retrieveSubject1.getSubname());
entityTransaction.commit();
}
}
Пока все в порядке.< /p>
Теперь посмотрите следующие строки в приведенном выше коде: -
Код: Выделить всё
Subject randomSubject = entityManager.find(Subject.class,4);
System.out.println("randomSubjectName:-"+randomSubject.getSubjectName());
randomSubject.setSubjectName("Chemistry");
После этого Я вызываю объектEntityManager.find(RetriveSubject.class,4), и результат (скажем, четвертый предмет, который я назвал физикой): -
Код: Выделить всё
Physics
Теперь после этого в следующих строках: -
Код: Выделить всё
Query retrieveSubject = entityManager.createQuery("select r from retrievesubject r where r.sid=:id");
List< RetrieveSubject> retrieveSubjectList = retrieveSubject.setParameter("id",4).getResultList();
for(RetrieveSubject retrieveSubject1 : retrieveSubjectList)
System.out.println(retrieveSubject1.getSid()+"----"+retrieveSubject1.getSubname());
Даже несмотря на то, что Hibernate сбрасывает изменения, вызывая приведенный ниже запрос на обновление перед запуском выбора: -
Код: Выделить всё
/* update
for org.example.bean.Subject */update TBL_SUBJECTS
set
subjectName=?
where
subjectId=?
Но если я прокомментирую строкуentityManager.find(RetieveSubject.class,4), а затем выполните код (предположим, я указал 4-е имя предмета как «Физика»), я получаю правильный результат как «Химия» после выполнения запроса.getResultList().
Кто-нибудь может сказать мне, почему происходит это несоответствие. Почему вывод отличается, когда присутствует find() + createQuery() и когда присутствует только createQuery()??
Подробнее здесь: https://stackoverflow.com/questions/791 ... reatequery