В спящем режиме показывать результаты левого соединения весной - PullRequest
0 голосов
/ 20 декабря 2011

Я изучаю Spring и Hibernate, и у меня небольшая, но довольно важная проблема.

Я хочу получить данные из базы данных:

 Query query = session.createSQLQuery("SELECT * FROM pool a LEFT JOIN pool_question b on a.id = b.poolid");

, а затем отправил результаты в виде списка в jspфайл из моего контроллера

model.addAttribute("pools", pool);

Моя база данных довольно проста:

пул:

id  name    slug    date_create deactivation_date   creator_id  active

, а вопрос пула

id  poolid  answer  order   question

Проблема в том, что когда я пытаюсь сделать цикл в JSP:

<c:forEach items="${pools}" var="pool">
        <td><c:out value="${pool.name}" /></td>
</c:forEach>

Tomcat отображает мне ошибку.

Когда я проверяю свой запрос в phpmyadmin, результат в порядке.

Хитрость в том, что когда я делаю запрос следующим образом:

Query query = session.createQuery("FROM Pool");

Результаты в JSP отображаются правильно.

Может ли кто-нибудь помочь мне, как отобразить результат этого запросав jsp?

Мой Pool.java это:

    package com.pool.app.domain;

// Generated 2011-12-20 12:45:22 by Hibernate Tools 3.4.0.CR1

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Pool generated by hbm2java
 */
@Entity
@Table(name = "pool", catalog = "pool")
public class Pool implements java.io.Serializable {

    private Integer id;
    private String name;
    private String slug;
    private Date dateCreate;
    private Date deactivationDate;
    private int creatorId;
    private int active;
    private Set<PoolQuestion> poolQuestions = new HashSet<PoolQuestion>(0);

    public Pool() {
    }

    public Pool(String name, String slug, Date dateCreate,
            Date deactivationDate, int creatorId, int active) {
        this.name = name;
        this.slug = slug;
        this.dateCreate = dateCreate;
        this.deactivationDate = deactivationDate;
        this.creatorId = creatorId;
        this.active = active;
    }

    public Pool(String name, String slug, Date dateCreate,
            Date deactivationDate, int creatorId, int active,
            Set<PoolQuestion> poolQuestions) {
        this.name = name;
        this.slug = slug;
        this.dateCreate = dateCreate;
        this.deactivationDate = deactivationDate;
        this.creatorId = creatorId;
        this.active = active;
        this.poolQuestions = poolQuestions;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "name", nullable = false, length = 200)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "slug", nullable = false, length = 200)
    public String getSlug() {
        return this.slug;
    }

    public void setSlug(String slug) {
        this.slug = slug;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "date_create", nullable = false, length = 19)
    public Date getDateCreate() {
        return this.dateCreate;
    }

    public void setDateCreate(Date dateCreate) {
        this.dateCreate = dateCreate;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "deactivation_date", nullable = false, length = 19)
    public Date getDeactivationDate() {
        return this.deactivationDate;
    }

    public void setDeactivationDate(Date deactivationDate) {
        this.deactivationDate = deactivationDate;
    }

    @Column(name = "creator_id", nullable = false)
    public int getCreatorId() {
        return this.creatorId;
    }

    public void setCreatorId(int creatorId) {
        this.creatorId = creatorId;
    }

    @Column(name = "active", nullable = false)
    public int getActive() {
        return this.active;
    }

    public void setActive(int active) {
        this.active = active;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pool")
    public Set<PoolQuestion> getPoolQuestions() {
        return this.poolQuestions;
    }

    public void setPoolQuestions(Set<PoolQuestion> poolQuestions) {
        this.poolQuestions = poolQuestions;
    }

}

, а PoolQuestion.java это:

    package com.pool.app.domain;

// Generated 2011-12-20 12:45:22 by Hibernate Tools 3.4.0.CR1

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * PoolQuestion generated by hbm2java
 */
@Entity
@Table(name = "pool_question", catalog = "pool")
public class PoolQuestion implements java.io.Serializable {

    private Integer id;
    private Pool pool;
    private String answer;
    private int order;
    private String question;

    public PoolQuestion() {
    }

    public PoolQuestion(Pool pool, String answer, int order) {
        this.pool = pool;
        this.answer = answer;
        this.order = order;
    }

    public PoolQuestion(Pool pool, String answer, int order, String question) {
        this.pool = pool;
        this.answer = answer;
        this.order = order;
        this.question = question;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "poolid", nullable = false)
    public Pool getPool() {
        return this.pool;
    }

    public void setPool(Pool pool) {
        this.pool = pool;
    }

    @Column(name = "answer", nullable = false, length = 500)
    public String getAnswer() {
        return this.answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    @Column(name = "order", nullable = false)
    public int getOrder() {
        return this.order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    @Column(name = "question", length = 500)
    public String getQuestion() {
        return this.question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

}

И главный вопрос - как должен выглядеть HQL-запрос, потому что запрос такой:

Query query = session.createQuery("From Pool as p left join fetch p.id as s");

не работает для меня.

Ответы [ 4 ]

0 голосов
/ 16 июня 2015

Вы можете попробовать это:

Query hqlQuery = session.createQuery("from Pool as P left join P.poolQuestion");

Вы можете найти больше здесь .

Несколько советов:
Если выиспользуете Hibernate и Spring, почему вы не используете getHibernateTemplate () для получения данных из таблиц?В этом случае вы можете использовать:

List<Pool> result = (List<Pool>) getHibernateTemplate().find("from Pool");

и все ваши данные будут в этом результате .Для получения более подробной информации вы можете воспользоваться этим примером .

Пожалуйста, проверьте, прав ли я, потому что я не проверял / не моделировал его.

0 голосов
/ 20 декабря 2011

При использовании Hibernate Обычно вы не хотите использовать собственный SQL, а скорее HQL .Если вы используете собственный запрос createSQLQuery, то вам нужно явно указать, как должны быть сопоставлены значения с вашим POJO или указать скаляры - см. Документацию hibernate.

и почему выво-первых, используя этот запрос? Не можете ли вы получить значения пула из некоторого сопоставления ассоциации класса Pool?В этом весь смысл Hibernate.

Позвольте мне быть более ясным.Сначала забудьте запрос на присоединение.Тебе это не нужно.Вы хотите, чтобы у экземпляров POJO не было какого-то безумного результирующего набора внешних соединений.

  1. Запросите все Pool данные, как вы это сделали Query query = session.createQuery("FROM Pool");
  2. Получить список, содержащий экземпляры пула, представляющие ваши данные List<Pool> pools = (List<Pool>) query.list();
  3. Теперь у вас есть. Все связанные данные лениво получают из Hibernate, когда вы их запрашиваете - pool.getPoolQuestions();
0 голосов
/ 20 декабря 2011
Query query = session.createQuery("from Pool");

Это запрос HQL, он выдаст вам список объектов (пула), поэтому проблем с использованием нет:

<c:forEach items="${pools}" var="pool">
        <td><c:out value="${pool.name}" /></td>
</c:forEach>

когда вы используете SQL-запрос, он отличается, вы не получите список объектов (вам нужно добавить код и преобразования, чтобы получить список пулов).

Вот пример:

@SuppressWarnings({ "unchecked", "rawtypes" })
public List<Pool> findPools()
{
    final String query = "select a.id as idAlias, a.name as nameAlias from pool a ....";
    List<Pool> list = (List<Pool>) getHibernateTemplate().execute(new HibernateCallback()
    {
        public Object doInHibernate(Session session) throws HibernateException
        {
            SQLQuery sqlQuery = session.createSQLQuery(query);
            return prepareQueryFind(sqlQuery).list();
        }
    });
    return list;
}

Здесь я полагаю, у вас есть конструктор, подобный:

public Pool(Integer id, String name);
/** Getters and Setters **/

если вы используете версию Hibernate> = 3.2

@SuppressWarnings("deprecation")
private Query prepareQueryFind(SQLQuery query)
{
    return query
   .addScalar("idAlias", Hibernate.INTEGER)
   .addScalar("nameAlias", Hibernate.STRING)
   .setResultTransformer(Transformers.aliasToBean(Pool.class));
}

Теперь вы можете называть fidpools следующим образом:

List<Pool> poolList = poolDao.findPools();
0 голосов
/ 20 декабря 2011

Без исключения трудно точно знать, что происходит не так. Однако прочитайте:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html

Я думаю, что вы проблема в том, что вы используете createSQLQuery вместо createQuery. Т.е. вы используете стандартный SQL вместо HQL. Чтобы начать, попробуйте изменить ваш запрос на:

SELECT a.* FROM pool a LEFT JOIN ...

и позвоните на .addEntity(Pool.class), т.е. session.createSQLQuery("<use above SQL>").addEntity(Pool.class);

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...