Хранимая процедура присоединения к объектам Hibernate / Spring Data - PullRequest
0 голосов
/ 23 марта 2020

Я получил эти две таблицы:

таблица z_users :

  • id
  • имя

стол z_phones :

  • id

  • iduser

  • телефон

Я получил хранимую процедуру с этим запросом:

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 не должен делать выбор.

Я начинаю думать, что я не следую лучшему пути, который может быть лучшим способом для достижения моей цели?

Спасибо!

...