java - 继续收到“java.lang.IllegalArgumentException:没有为该名称定义查询”,即使我有具有适当名称的@NamedQuery
问题描述
我有休眠 JPA 应用程序。我在 DAO 类的函数中不断收到“java.lang.IllegalArgumentException: No query defined for that name [Singer.findAll]”,即使我在 @NamedQuery 中正确定义了名称。这是我的实体类
package ch8.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "singer")
@NamedQueries({
@NamedQuery(name = Singer.FIND_BY_ID,
query = "select distinct s from Singer s "
+ "left join fetch s.albums a "
+ "left join fetch s.instruments i "
+ "where s.id = :id"),
@NamedQuery(name = Singer.FIND_ALL_WITH_ALBUM,
query = "select distinct s from Singer s "
+ "left join fetch s.albums a "
+ "left join fetch s.instruments i"),
@NamedQuery(name = Singer.FIND_ALL,
query = "select s from Singer s")
})
@SqlResultSetMapping(name = "singerResult",
entities = @EntityResult(entityClass = Singer.class))
public class Singer implements Serializable {
private Long id;
private String firstName;
private String lastName;
private Date birthDate;
private Long version;
private Set<Album> albums = new HashSet<>();
private Set<Instrument> instruments = new HashSet<>();
public static final String FIND_ALL = "Singer.findAll";
public static final String FIND_BY_ID = "Singer.findById";
public static final String FIND_ALL_WITH_ALBUM = "Singer.findAllWithAlbum";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "FIRST_NAME")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name = "LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Temporal(TemporalType.DATE)
@Column(name = "BIRTH_DATE")
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Version
@Column(name = "VERSION")
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
@OneToMany(mappedBy = "singer", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<Album> getAlbums() {
return albums;
}
public void setAlbums(Set<Album> albums) {
this.albums = albums;
}
@ManyToMany
@JoinTable(name = "singer_instrument",
joinColumns = @JoinColumn(name = "SINGER_ID"),
inverseJoinColumns = @JoinColumn(name = "INSTRUMENT_ID"))
public Set<Instrument> getInstruments() {
return instruments;
}
public void setInstruments(Set<Instrument> instruments) {
this.instruments = instruments;
}
@Override
public String toString () {
return "Singer - Id: " + id + ", First name: "
+ firstName + ", Last name: " + lastName
+ ", Birthday: " + birthDate;
}
public boolean addAlbum(Album album) {
if (albums == null) {
albums = new HashSet<Album>();
albums.add(album);
return true;
}
if (albums.contains(album))
return false;
albums.add(album);
return true;
}
public boolean removeAlbum(Album album) {
if (album == null)
return false;
if (!albums.contains(album))
return false;
albums.remove(album);
return true;
}
}
和 DAO 类
package ch8.dao;
import ch8.entities.Singer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Collection;
@Transactional
@Repository("singerDao")
public class SingerDao implements Dao<Singer> {
@PersistenceContext
private EntityManager entityManager;
...some other functions...
@Override
@Transactional(readOnly = true)
public Collection<Singer> findAll() {
return entityManager.createNamedQuery(Singer.FIND_ALL, Singer.class).getResultList();
}
...some other functions...
}
我建议它可能与类映射有关,因为常规 createQuery(String, Class) 也不起作用。
解决方案
感谢 JLazar0 的建议,我找到了解决问题的方法。与往常一样,问题不是因为错误的逻辑、错误配置或持久性。尽管一切似乎都很好,但我一直收到“没有为该名称定义查询”的原因是因为我在 LocalContainerEntityManagerFactoryBean.setPackagesToScan() 中的包名称错误。在方法参数的小修正后,我的代码通过了所有测试。无论如何,感谢所有试图提供帮助的人
推荐阅读
- ios - 添加带有点击手势的图钉时,我的图钉会显示在其他地方。
- javascript - 如何使用 Javascript 使 Django 表单字段消失?
- java - Spark结构化流状态管理
- javascript - 使用 XML 解析时显示未定义的文档元素
- javascript - 匹配某个范围内的单个正则表达式字符
- c - 在 Windows 中配置 Simple2D 图形库
- node.js - 如何在 docker 容器和 nodemon 中调试节点、js 应用程序?
- css - 媒体查询和 symfony 安可
- r - 零使用 str_c() 消失
- python - 熊猫测量自条件以来经过的时间