2017-04-11 42 views
1

我使用Java 8Spring 4.3.1.RELEASE,JPA 2Hibernate 5.2.1.FinalMySQL休眠执行多个相同的查询

hibernate.dialect = org.hibernate.dialect.MySQLDialect 
hibernate.show_sql = true 
hibernate.format_sql = true 

我有下面的代码,它只是简单SELECT声明:

import java.util.List;  
import org.springframework.stereotype.Repository;  
import com.jobs.spring.domain.Category; 

@Repository("categoryDao") 
public class CategoryDaoImpl extends JpaDao<String, Category> implements CategoryDao { 

    @Override 
    public List<Category> findAll() { 
     List<Category> categories = (List<Category>) entityManager.createQuery("Select t from " + entityClass.getSimpleName() + " t order by name").getResultList(); 
     return categories; 
    } 
} 

如果我调试代码,此方法只调用一次,但你可以从下面的输出看, Hibernate多次执行相同的SQL语句。

10:52:13,960 INFO [stdout] (default task-4) Hibernate: 
10:52:13,962 INFO [stdout] (default task-4)  select 
10:52:13,962 INFO [stdout] (default task-4)   category0_.id as id1_0_, 
10:52:13,962 INFO [stdout] (default task-4)   category0_.ICON as ICON2_0_, 
10:52:13,963 INFO [stdout] (default task-4)   category0_.CATERGORY as CATERGOR3_0_ 
10:52:13,963 INFO [stdout] (default task-4)  from 
10:52:13,964 INFO [stdout] (default task-4)   category category0_ 
10:52:13,964 INFO [stdout] (default task-4)  order by 
10:52:13,965 INFO [stdout] (default task-4)   category0_.CATERGORY 
10:52:14,399 INFO [stdout] (default task-4) Hibernate: 
10:52:14,400 INFO [stdout] (default task-4)  select 
10:52:14,400 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:14,401 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:14,402 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:14,402 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:14,403 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:14,403 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:14,404 INFO [stdout] (default task-4)  from 
10:52:14,404 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:14,405 INFO [stdout] (default task-4)  where 
10:52:14,406 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:14,813 INFO [stdout] (default task-4) Hibernate: 
10:52:14,814 INFO [stdout] (default task-4)  select 
10:52:14,815 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:14,815 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:14,816 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:14,816 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:14,817 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:14,817 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:14,818 INFO [stdout] (default task-4)  from 
10:52:14,819 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:14,819 INFO [stdout] (default task-4)  where 
10:52:14,820 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:15,219 INFO [stdout] (default task-4) Hibernate: 
10:52:15,220 INFO [stdout] (default task-4)  select 
10:52:15,221 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:15,221 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:15,222 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:15,222 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:15,223 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:15,223 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:15,224 INFO [stdout] (default task-4)  from 
10:52:15,225 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:15,225 INFO [stdout] (default task-4)  where 
10:52:15,226 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:15,637 INFO [stdout] (default task-4) Hibernate: 
10:52:15,637 INFO [stdout] (default task-4)  select 
10:52:15,638 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:15,638 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:15,639 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:15,640 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:15,640 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:15,641 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:15,641 INFO [stdout] (default task-4)  from 
10:52:15,642 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:15,642 INFO [stdout] (default task-4)  where 
10:52:15,643 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:16,079 INFO [stdout] (default task-4) Hibernate: 
10:52:16,080 INFO [stdout] (default task-4)  select 
10:52:16,080 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:16,081 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:16,081 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:16,082 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:16,082 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:16,083 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:16,084 INFO [stdout] (default task-4)  from 
10:52:16,084 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:16,085 INFO [stdout] (default task-4)  where 
10:52:16,085 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:16,819 INFO [stdout] (default task-4) Hibernate: 
10:52:16,819 INFO [stdout] (default task-4)  select 
10:52:16,820 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:16,820 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:16,821 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:16,822 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:16,822 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:16,823 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:16,824 INFO [stdout] (default task-4)  from 
10:52:16,824 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:16,825 INFO [stdout] (default task-4)  where 
10:52:16,825 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:17,943 INFO [stdout] (default task-4) Hibernate: 
10:52:17,944 INFO [stdout] (default task-4)  select 
10:52:17,945 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:17,945 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:17,946 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:17,946 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:17,947 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:17,947 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:17,948 INFO [stdout] (default task-4)  from 
10:52:17,949 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:17,949 INFO [stdout] (default task-4)  where 
10:52:17,950 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:19,460 INFO [stdout] (default task-4) Hibernate: 
10:52:19,461 INFO [stdout] (default task-4)  select 
10:52:19,462 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:19,462 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:19,463 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:19,463 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:19,464 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:19,464 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:19,465 INFO [stdout] (default task-4)  from 
10:52:19,465 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:19,466 INFO [stdout] (default task-4)  where 
10:52:19,467 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:20,521 INFO [stdout] (default task-4) Hibernate: 
10:52:20,521 INFO [stdout] (default task-4)  select 
10:52:20,522 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:20,523 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:20,523 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:20,524 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:20,524 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:20,525 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:20,525 INFO [stdout] (default task-4)  from 
10:52:20,526 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:20,526 INFO [stdout] (default task-4)  where 
10:52:20,527 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:20,965 INFO [stdout] (default task-4) Hibernate: 
10:52:20,966 INFO [stdout] (default task-4)  select 
10:52:20,966 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:20,967 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:20,968 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:20,968 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:20,969 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:20,969 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:20,970 INFO [stdout] (default task-4)  from 
10:52:20,970 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:20,971 INFO [stdout] (default task-4)  where 
10:52:20,971 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:21,364 INFO [stdout] (default task-4) Hibernate: 
10:52:21,365 INFO [stdout] (default task-4)  select 
10:52:21,365 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:21,366 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:21,366 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:21,367 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:21,367 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:21,368 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:21,368 INFO [stdout] (default task-4)  from 
10:52:21,369 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:21,370 INFO [stdout] (default task-4)  where 
10:52:21,370 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:21,774 INFO [stdout] (default task-4) Hibernate: 
10:52:21,774 INFO [stdout] (default task-4)  select 
10:52:21,775 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:21,775 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:21,776 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:21,777 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:21,777 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:21,778 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:21,778 INFO [stdout] (default task-4)  from 
10:52:21,779 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:21,779 INFO [stdout] (default task-4)  where 
10:52:21,780 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:22,194 INFO [stdout] (default task-4) Hibernate: 
10:52:22,195 INFO [stdout] (default task-4)  select 
10:52:22,195 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:22,196 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:22,196 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:22,197 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:22,197 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:22,198 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:22,199 INFO [stdout] (default task-4)  from 
10:52:22,199 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:22,200 INFO [stdout] (default task-4)  where 
10:52:22,200 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:22,590 INFO [stdout] (default task-4) Hibernate: 
10:52:22,590 INFO [stdout] (default task-4)  select 
10:52:22,591 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:22,591 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:22,592 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:22,592 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:22,593 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:22,594 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:22,594 INFO [stdout] (default task-4)  from 
10:52:22,595 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:22,595 INFO [stdout] (default task-4)  where 
10:52:22,596 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 
10:52:23,009 INFO [stdout] (default task-4) Hibernate: 
10:52:23,010 INFO [stdout] (default task-4)  select 
10:52:23,010 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_0_, 
10:52:23,011 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_0_, 
10:52:23,012 INFO [stdout] (default task-4)   subcategor0_.id as id1_21_1_, 
10:52:23,012 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID as CATEGORY4_21_1_, 
10:52:23,013 INFO [stdout] (default task-4)   subcategor0_.ICON as ICON2_21_1_, 
10:52:23,013 INFO [stdout] (default task-4)   subcategor0_.SUBCATEGORY as SUBCATEG3_21_1_ 
10:52:23,014 INFO [stdout] (default task-4)  from 
10:52:23,015 INFO [stdout] (default task-4)   subcategory subcategor0_ 
10:52:23,015 INFO [stdout] (default task-4)  where 
10:52:23,016 INFO [stdout] (default task-4)   subcategor0_.CATEGORY_ID=? 

如果任何人都可以建议如何让Hibernate按预期执行一次查询,我将不胜感激。

UPDATE

这里是我的模型对象:

Category.java

@Entity 
@Table(name="category") 
@XmlRootElement(name="category") 
public class Category extends AbstractDomain<String> { 

    @Id 
    private String id; 

    @Size(min=3, max=55) 
    @Column(name = "CATERGORY", nullable = false) 
    private String name; 

    @JsonIgnore 
    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "category") 
    private Set<SubCategory> subCategories; 

    @JsonIgnore 
    @Basic(fetch=FetchType.LAZY) 
    @Lob 
    @Column(name = "ICON", nullable = true) 
    private byte[] icon; 

    @Transient 
    private byte[] icon64; 

    @XmlElement 
    public byte[] getIcon64() { 
     return icon64; 
    } 

    public void setIcon64(byte[] icon64) { 
     this.icon64 = icon64; 
    } 

    @XmlElement 
    public byte[] getIcon() { 
     return icon; 
    } 

    public void setIcon(byte[] icon) { 
     this.icon = icon; 
    } 

    @XmlElement 
    public String getId() { 
     return id; 
    } 

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

    @XmlElement 
    public String getName() { 
     return name; 
    } 

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

    public Set<SubCategory> getSubCategories() { 
     return subCategories; 
    } 

    public void setSubCategories(Set<SubCategory> subCategories) { 
     this.subCategories = subCategories; 
    } 
} 

UPDATE

感谢您对下面的建议。我的代码更新到以下几点:

public List<Category> findAll() { 
    List<Category> categories = (List<Category>) entityManager.createQuery("Select t from " + entityClass.getSimpleName() + " t JOIN FETCH com.jobs.spring.domain.SubCategory order by t.name").getResultList(); 
    return categories; 
} 

但仍得到一个错误:

11:29:42,188 INFO [stdout] (default task-2) Hibernate: 
11:29:42,188 INFO [stdout] (default task-2)  select 
11:29:42,188 INFO [stdout] (default task-2)   category0_.id as id1_0_, 
11:29:42,188 INFO [stdout] (default task-2)   category0_.ICON as ICON2_0_, 
11:29:42,188 INFO [stdout] (default task-2)   category0_.CATERGORY as CATERGOR3_0_ 
11:29:42,188 INFO [stdout] (default task-2)  from 
11:29:42,188 INFO [stdout] (default task-2)   category category0_ 
11:29:42,189 INFO [stdout] (default task-2)  inner join 
11:29:42,189 INFO [stdout] (default task-2)   subcategory subcategor1_ 
11:29:42,189 INFO [stdout] (default task-2)    on 
11:29:42,189 INFO [stdout] (default task-2)  order by 
11:29:42,189 INFO [stdout] (default task-2)   category0_.CATERGORY 
11:29:42,536 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-2) SQL Error: 1064, SQLState: 42000 
11:29:42,537 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-2) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by category0_.CATERGORY' at line 1 
11:29:43,306 ERROR [io.undertow.request] (default task-2) UT005023: Exception handling request to /jbosswildfly-1.0/category/list: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 

UPDATE

我的代码更新到以下几点:

List<Category> categories = (List<Category>) entityManager.createQuery("Select c from Category c JOIN FETCH c.subCategories s order by c.name").getResultList(); 

它没有错误,但它只返回类别的重复项没有SubCategories。所以我瘦我需要改变SELECT中的内容。

我曾尝试:

SELECT * (unexpected token: * near line 1) 

SELECT c, s (same as SELECT c) 
+0

你在哪里使用'findAll()'方法。假设findAll()已经在JPA 2.0中实现。只需更改方法名称并检查。 –

+0

嗨Rajith,谢谢你的回应。我不完全理解你的问题。 'findAll()'是从RESTful服务调用的。我修改了上面的描述来包含整个班级。 – Richard

回答

4

这是因为你的Category类有引用到其他类别,被称为subcategory。对于每个类别,您需要获取所有子类别,以便获得许多子查询。我们称之为SQL N + 1问题。让我们尝试使用FETCH JOIN

SELECT c FROM category c JOIN FETCH c.subCategories 

应该执行一个(更大的)查询。

+0

比你。我尝试了:'List categories =(List )entityManager.createQuery(“Select t from”+ entityClass.getSimpleName()+“t JOIN FETCH t.subcategory order by name”)。getResultList();'。但是我收到以下错误:'无法解析:com.jobs.spring.domain的属性:子类别。类别[从com.jobs.spring.domain.Category中选择t t按联系人姓名JOIN FETCH t.subcategory顺序]' – Richard

+0

我应该创建一个本机查询吗? – Richard

+0

@Richard,检查名字:)在你的情况下应该是'subCategories'。请记住,在JPQL中,我们使用属性的名称和大写/小写很重要。 –