2015-10-14 2 views
0

Я ищу способ запросить конкретные столбцы и иметь посторонний объект, присутствующий в корневом объекте, с помощью CriteriaBuilder. Вот контекст: У меня есть EntityAКак я могу запросить конкретные столбцы из 2 таблиц внутри моих объектов, используя JPA 2.0?

@Entity 
@Table(name = "ENTITY_A") 
public class EntityA { 
    int id; 
    int entityBKey; 
    EntityBObject entityBObject; 
    int AColumn1; 
    int AColumn2; 

    @Basic 
    public Long getEntityBKey() { 
     return entityBKey; 
    } 

    @ManyToOne 
    @JoinColumn(name = "ENTITY_B_FK") 
    public EntityBObject getProgramType() { 
     return entityBObject; 
    } 

    @Basic 
    @Column(name = "COLUMN_1") 
    public String getAColumn1() { 
     return AColumn1; 
    } 
    ... 
} 

Тогда я EntityB

public class EntityB { 
    int id; 
    int BColumn1; 
    int BColumn2; 
    ... 
} 

Теперь я хочу, чтобы запросить столбец AColumn1 из EntityA и колонки BColumn1 от EntityB, при этом имея объект EntityB внутри EntityA. Как я могу это достичь?

Как изменить следующее, чтобы получить частичный EntityA с EntityB внутри?

public List<EntityA> findAll() { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<EntityA> criteria = cb.createQuery(EntityA.class); 
    Root<EntityA> root = criteria.from(EntityA.class); 
    criteria.select(root); 

    return em.createQuery(criteria).getResultList(); 
} 

Спасибо!

Редактировать @Tassos Bassoukos Да, это то, что я в конечном итоге делает, но это было бы получить действительно грязный, когда запрос становится более сложным. Пример. Потяните клиентов с их заказами, с элементами для каждого заказа. Было бы так много java для достижения этого, хотя я мог бы быть автоматизирован, поэтому мой объект автоматически заполняется.

public List<EntityA> findAll() { 
    ArrayList<EntityA> result = new ArrayList<>(); 
    Query q = em.createQuery("select eA, eB, from EntityA eA, EntityB eB where eA.key = eB.key"); 

    @SuppressWarnings("unchecked") 
    List<Object[]> abc = q.getResultList(); 
    for (Object[] array : abc) { 
     EntityA eA = (EntityA) array[0]; 
     EntityB eB = (EntityB) array[1]; 
     eA.setEntityB(eB); 
     result.add(pe); 
    } 

    return result; 
} 
+0

Будет что-то вроде [этого] (http://stackoverflow.com/questions/6877857/jpa-query-that-returns-multiple-entities/6880396#6880396) сделать трюк? –

+0

@TassosBassoukos No:/То, что я закончил делать (отредактированный пост выше), но я ищу способ автоматизировать популяцию подэлементов, я также не хочу создавать дополнительные классы или конструкторы. Это умело? – user3850453

ответ

-1

Во-первых, почему вы хотите получить частичное образование? Это не имеет смысла с точки зрения ОО. Существует ли конкретное конкретное требование для этого?

Во-вторых, вам нужны сущности или столбцы сущностей? Вы можете сделать оба с CriteriaBuilder, но вам нужно быть понятным: а) что вы хотите достичь, b) почему вы хотите его достичь.

В-третьих, есть JOIN FETCH.

+0

Q1: база данных может содержать столько столбцов с таким количеством данных, что это может повлиять на производительность. Q2.a) Я хочу объект objcetA, представляющий следующие {colA1 = abc, entityB = {colB1 = 111, colB2 = 222}}. Q2.b) Реплицируйте запрос sql для автоматического анализа ответа в объекте. Q3: Я попытался оглянуться и не смог найти полный пример, как вы код с использованием объекта Entity_? Как бы вы отметили аннотацию объекта? – user3850453

+0

Ну, вы можете создать запрос типа 'select eA.colA1, eB из EntityA eA, EntityB eB join fetch eB.colleC где ...' –

+0

Вам понадобится частичная сущность, если ваша система полагается на базу данных SQL, Не заботьтесь об ориентации объекта. Если запрос объединяется в несколько таблиц из-за того, как написана модель домена, и вы ищете только внешний ключ, тогда у вас есть проблема масштабируемости. –

 Смежные вопросы

  • Нет связанных вопросов^_^