Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate执行多个相同的查询_Java_Mysql_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Java Hibernate执行多个相同的查询

Java Hibernate执行多个相同的查询,java,mysql,hibernate,jpa,jpa-2.0,Java,Mysql,Hibernate,Jpa,Jpa 2.0,我正在使用Java8和Spring4.3.1.RELEASE、JPA2和Hibernate5.2.1.Final和MySQL hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = true 我有以下代码,它执行一个简单的SELECT语句: import java.util.List; import org.springframewor

我正在使用
Java8
Spring4.3.1.RELEASE
JPA2
Hibernate5.2.1.Final
MySQL

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按预期只执行一次查询,我将不胜感激

更新

这是我的模型对象:

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;
    }
}
更新

我将代码更新为以下内容:

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;
}
    List<Category> categories = (List<Category>) entityManager.createQuery("Select c from Category c JOIN FETCH c.subCategories s order by c.name").getResultList();

这是因为您的
类别
类引用了其他类别,称为
子类别
。对于每个类别,您需要获取所有子类别,因此会得到许多子查询。我们称之为SQLN+1问题。让我们尝试使用
fetchjoin

SELECT c FROM category c JOIN FETCH c.subCategories

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

这是因为您的
类别
类引用了其他类别,称为
子类别
。对于每个类别,您需要获取所有子类别,因此会得到许多子查询。我们称之为SQLN+1问题。让我们尝试使用
fetchjoin

SELECT c FROM category c JOIN FETCH c.subCategories

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

在哪里使用
findAll()
方法。假设findAll()已经在JPA2.0中实现。只需更改方法名称并检查。嗨,Rajith,谢谢您的回复。我不完全理解你的问题<代码>findAll()从RESTful服务调用。我修改了上面的描述以包含整个类。您在哪里使用
findAll()
方法。假设findAll()已经在JPA2.0中实现。只需更改方法名称并检查。嗨,Rajith,谢谢您的回复。我不完全理解你的问题<代码>findAll()从RESTful服务调用。我已经修改了上面的描述,以包括整个类。比你。我确实尝试过:
List categories=(List)entityManager.createQuery(“从“+entityClass.getSimpleName()+”t中选择t并按名称获取t.subcategory顺序”).getResultList()。但是我得到了以下错误:
无法解析属性:子类别:com.jobs.spring.domain.Category[从com.jobs.spring.domain.Category中选择t加入FETCH t.subcategory order by name]
我应该创建一个本地查询吗?@Richard,检查名称:)在您的情况下应该是
子类别
。请记住,在JPQL中,我们使用属性名称,大写/小写很重要。尝试以下操作后:
List categories=(List)entityManager.createNativeQuery(“Select*from ebdb.Category as c JOIN FETCH ebdb.subcategory order by c.name”).getResultList()。我得到这个错误:
您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行“FETCH ebdb.subcategory order by c.name”附近使用的正确语法
谢谢,我已经更新了我认为正确的名称,但仍然出现错误(请参阅上面的更新)。我想这是因为
JOIN
上没有
关键字。我确实尝试过:
List categories=(List)entityManager.createQuery(“从“+entityClass.getSimpleName()+”t中选择t并按名称获取t.subcategory顺序”).getResultList()。但是我得到了以下错误:
无法解析属性:子类别:com.jobs.spring.domain.Category[从com.jobs.spring.domain.Category中选择t加入FETCH t.subcategory order by name]
我应该创建一个本地查询吗?@Richard,检查名称:)在您的情况下应该是
子类别
。请记住,在JPQL中,我们使用属性名称,大写/小写很重要。尝试以下操作后:
List categories=(List)entityManager.createNativeQuery(“Select*from ebdb.Category as c JOIN FETCH ebdb.subcategory order by c.name”).getResultList()。我得到这个错误:
您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行“FETCH ebdb.subcategory order by c.name”附近使用的正确语法
谢谢,我已经更新了我认为正确的名称,但仍然出现错误(请参阅上面的更新)。我想这是因为
JOIN
没有
ON
关键字。
SELECT * (unexpected token: * near line 1)

SELECT c, s  (same as SELECT c)
SELECT c FROM category c JOIN FETCH c.subCategories