Я получил эти две таблицы:
таблица z_users :
стол z_phones :
Я получил хранимую процедуру с этим запросом:
Select * from z_users INNER JOIN z_phones on z_users.id = z_phones.iduser where z_users.id = 1;
Я хотел бы получить этот хранимый pro c через Spring Data / Hibernate.
Итак, я создал два класса:
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Immutable;
import javax.persistence.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Data
@Entity
@Immutable
@NoArgsConstructor
public class ZUser {
@Id
private int id;
private String name;
public ZUser(String name, ZPhone... zPhones) {
this.name = name;
this.zPhone.addAll(Arrays.stream(zPhones).collect(Collectors.toUnmodifiableList()));
}
@OneToMany
private List<ZPhone> zPhone;
}
import lombok.Data;
import org.hibernate.annotations.Immutable;
import javax.persistence.Entity;
import javax.persistence.Id;
@Data
@Entity
@Immutable
public class ZPhone {
@Id
private int id;
private String phone;
}
Я пытался вызвать SP с помощью этого кода:
import lombok.extern.slf4j.Slf4j;
import net.resourcestorage.demojoin.database.model.ZUser;
import org.hibernate.Session;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;
@Slf4j
@Service
public class ZUserService {
@PersistenceContext
private EntityManager entityManager;
public List<ZUser> getUsers() {
Session session = (Session) entityManager.getDelegate();
Query query = session.createSQLQuery("CALL getUsers()").addEntity(ZUser.class);
log.info(query.getResultList().toString());
List list = query.getResultList();
return null; // don't care about this
}
}
Запустив это, Hibernate делает это:
Hibernate: CALL getUsers()
Hibernate: select zphone0_.ZUser_id as zuser_id1_4_0_, zphone0_.zPhone_id as zphone_i2_4_0_, zphone1_.id as id1_2_1_, zphone1_.phone as phone2_2_1_ from ZUser_ZPhone zphone0_ inner join ZPhone zphone1_ on zphone0_.zPhone_id=zphone1_.id where zphone0_.ZUser_id=?
Здесь hibernate не должен делать выбор.
Я начинаю думать, что я не следую лучшему пути, который может быть лучшим способом для достижения моей цели?
Спасибо!