Hibernate - @SubSelect

Posted by dogukanhan on June 10, 2020 · 1 min read

@SubSelect Annotation bir select sorgusu entity’e aktarır(mapler). Bu aktarma işlemi sadece select sorgusu için kullanılabilir ve oluşturulan entity read-only(sadece okuma) özelliğindedir, silinemez ve güncellenemez.

@SubSelect daha çok veritabanı üzerinde çok fazla tablo yaratamadığımız veya veritabanında yeni tablo ve yeni view yaratma yetkimizin olmadığı durumlarda, varolan tablolardan select sorgusunu bir entity aktarmakta kullanılmaktadır. Aslında JDBC ile select sorgusu yaptığımızda yaratılan ResultSet nesnesini bir sınıfa aktarır.

Aşağıdaki sınıf için bir subselect sınıf oluşturalım.

@Entity
@org.hibernate.annotations.Immutable
public class Student {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String lastName;

    private String email;

    private String password;

    private String number;
}

Student sınıfında yer alan ID,NAME ve NUMBER bilgilerini içereren bir @SubSelect Annotation kullanan entity sınıfı oluşturduk. Bu sınıf read-only olduğundan dolayı @Immutable Annotation’ı ekledik.

@Entity
@org.hibernate.annotations.Subselect(
        value = "select s.ID, s.NAME, s.NUMBER from STUDENT s"
)
@org.hibernate.annotations.Immutable
public class StudentInfo {

    @Id
    private Long id;

    private String name;

    private String number;
}

@SubSelect kullanılan entity sınıflarıda diğer entitiy sınıflarındakiler gibi JPQL içerisinde kullanılabilir, aşağıda bu sınıfa yönelik bir select sorgusu yer almakta.

List<StudentInfo> studentInfos = session.createQuery("FROM StudentInfo", StudentInfo.class).getResultList();
        System.out.println(studentInfos);