Spring Data Repository'de ham SQL kullanmam gerekiyor, bu mümkün mü? Etrafta gördüğüm her @Query
şey her zaman varlık temelli.
Spring Data Repository'de ham SQL kullanmam gerekiyor, bu mümkün mü? Etrafta gördüğüm her @Query
şey her zaman varlık temelli.
Yanıtlar:
@Query ek açıklaması, nativeQuery bayrağını true olarak ayarlayarak yerel sorguların yürütülmesine izin verir.
Spring Data JPA referans belgelerinden alıntı .
Ayrıca, adlandırılmış bir yerel sorgu ile nasıl yapılacağına ilişkin bu bölüme bakın .
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
EVET, bunu aşağıdaki yollarla yapabilirsiniz:
1. CrudRepository tarafından (Projeksiyon)
Spring Veri Depoları, sorgu yöntemlerini kullanırken genellikle etki alanı modelini döndürür. Ancak bazen çeşitli nedenlerle o modelin görünümünü değiştirmeniz gerekebilir.
Varlığınızın şöyle olduğunu varsayalım:
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name = "USER_INFO_TEST")
public class UserInfoTest {
private int id;
private String name;
private String rollNo;
public UserInfoTest() {
}
public UserInfoTest(int id, String name) {
this.id = id;
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, precision = 0)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "roll_no", nullable = true)
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}
Şimdi Projeksiyon sınıfınız aşağıdaki gibidir. İhtiyacınız olan alanlar olabilir.
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
Ve Your Data Access Object(Dao) is like bellow
:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.ArrayList;
public interface UserInfoTestDao extends CrudRepository<UserInfoTest,Integer> {
@Query(value = "select id,name,roll_no from USER_INFO_TEST where rollNo = ?1", nativeQuery = true)
ArrayList<IUserProjection> findUserUsingRollNo(String rollNo);
}
Şimdi ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)
size kullanıcı listesini verecektir.
2. EntityManager'ı kullanma
Sorgunuzun " roll_no = 1001 olduğu kullanıcılardan gelen adı seçin " olduğunu varsayalım .
Burada sorgu, id ve name sütununa sahip bir nesne döndürür. Response sınıfınız aşağıdaki gibidir:
Response sınıfınız şuna benzer:
public class UserObject{
int id;
String name;
String rollNo;
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}
burada UserObject yapıcısı bir Nesne Dizisi alacak ve nesneyi içeren verileri ayarlayacaktır.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
Sorgu yürütme işleviniz aşağıdaki gibidir:
public UserObject getUserByRoll(EntityManager entityManager,String rollNo) {
String queryStr = "select id,name from users where roll_no = ?1";
try {
Query query = entityManager.createNativeQuery(queryStr);
query.setParameter(1, rollNo);
return new UserObject((Object[]) query.getSingleResult());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
Burada aşağıdaki paketleri içe aktarmanız gerekir:
import javax.persistence.Query;
import javax.persistence.EntityManager;
Şimdi ana sınıfınız, bu işlevi çağırmalısınız. Önce EntityManager'ı alın ve bu getUserByRoll(EntityManager entityManager,String rollNo)
işlevi çağırın . Çağrı prosedürü aşağıda verilmiştir:
İşte İthalat
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
olsun EntityManager
bu şekilde gelen:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Artık bu userObject'te verileriniz var.
Not:
query.getSingleResult () bir nesne dizisi döndürür. Sütun konumunu ve veri türünü sorgu sütunu konumu ile korumalısınız.
select id,name from users where roll_no = 1001
sorgu bir dizi döndürür ve bu [0] --> id and [1] -> name
.
Daha fazla bilgi bu konuyu ve bu Konuyu ziyaret edin
Teşekkürler :)
Ayrıca, JPA kullanmadan ham SQL ile veritabanlarına erişmek için Spring Data Commons üzerine kurulmuş bir topluluk projesi olan Spring Data JDBC deposunu kullanmak da mümkündür .
Spring Data JPA'dan daha az güçlüdür, ancak Hibernate gibi bir ORM kullanmadan basit projeler için hafif bir çözüm istiyorsanız, bu denemeye değer bir çözümdür.
createNativeQuery ("Here Nagitive SQL Query") kullanabiliriz;
Örneğin :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
em
Değişkeni nasıl yaratacağınızı da gösterdiyseniz yararlı / eksiksiz olur .
Spring Repository'de ham sorgu kullanmak mümkündür.
@Query(value = "SELECT A.IS_MUTUAL_AID FROM planex AS A
INNER JOIN planex_rel AS B ON A.PLANEX_ID=B.PLANEX_ID
WHERE B.GOOD_ID = :goodId",nativeQuery = true)
Boolean mutualAidFlag(@Param("goodId")Integer goodId);