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