我正在使用Spring Boot Rest API,并且我早些时候问过一个有关将pojo类映射到结果集的问题 Could not locate appropriate constructor on class .....
我得到了有效的答案,但是当我仅使用一个实体类和一个SqlResultSetMapping文件时。
我的StackTrace:
javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [UserMapping]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.AbstractSharedSessionContract.createNativeQuery(AbstractSharedSessionContract.java:1035)
at org.hibernate.internal.AbstractSharedSessionContract.createNativeQuery(AbstractSharedSessionContract.java:109)
at com.app.ecclesiamainframe.service.impl.UsersServiceImpl.findByusername(UsersServiceImpl.java:89)
at com.app.ecclesiamainframe.service.impl.UsersServiceImpl$$FastClassBySpringCGLIB$$ae026741.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodinvocation.invokeJoinpoint(CglibAopProxy.java:769)
Caused by: org.hibernate.MappingException: Unknown SqlResultSetMapping [UserMapping]
at org.hibernate.query.internal.NativeQueryImpl.setResultSetMapping(NativeQueryImpl.java:147)
at org.hibernate.internal.AbstractSharedSessionContract.createNativeQuery(AbstractSharedSessionContract.java:1031)
... 64 more
我的会员实体:
*
*/
package com.app.ecclesiamainframe.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import com.vladmihalcea.hibernate.type.json.JsonStringType;
import lombok.Data;
/**
* @author Harry
*
*/
@Entity
@Table(name="members_tb")
@Data
@TypeDef(
name = "json",typeclass = JsonStringType.class
)
@SqlResultSetMapping(
name = "MemberMapping",classes = @ConstructorResult(
targetclass = Members.class,columns = {
@ColumnResult(name = "memberId",type = Long.class),@ColumnResult(name = "dcaRegno",@ColumnResult(name = "address"),@ColumnResult(name = "age"),@ColumnResult(name = "areaId",@ColumnResult(name = "birthday"),@ColumnResult(name = "cellId",@ColumnResult(name = "dca"),@ColumnResult(name = "department"),@ColumnResult(name = "editor"),@ColumnResult(name = "firstTime"),@ColumnResult(name = "gender"),@ColumnResult(name = "maritalStatus"),@ColumnResult(name = "memberEmail"),@ColumnResult(name = "memberHomePhoneNum",@ColumnResult(name = "memberMobileNum",@ColumnResult(name = "memberName"),@ColumnResult(name = "note"),@ColumnResult(name = "secondTime")
}))
public class Members implements Serializable {
/**
*
*/
public Members() {}
private static final long serialVersionUID = 1L;
@Id
@Column(name="memberId")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long memberId;
@Column(name="dcaRegno")
private Long dcaRegno;
@Type(type = "json")
@Column(columnDefinition = "json",name="address")
private String address;
@Column(name="age")
private String age;
@Column(name="areaId")
private Long areaId;
@Column(name="birthday")
private String birthday;
@Column(name="cellId")
private Long cellId;
@Type(type = "json")
@Column(columnDefinition = "json",name="dca")
private String dca;
@Column(name="department")
private String department;
@Column(name="editor")
private String editor;
@Column(name="firstTime")
private String firstTime;
@Column(name="gender")
private String gender;
@Column(name="maritalStatus")
private String maritalStatus;
@Column(name="memberEmail")
private String memberEmail;
@Column(name="memberHomePhoneNum")
private Long memberHomePhoneNum;
@Column(name="memberMobileNum")
private Long memberMobileNum;
@Column(name="memberName")
private String memberName;
@Column(name="note")
private String note;
@Column(name="secondTime")
private String secondTime;
public Members(Long memberId,String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public Members(Long memberId,Long dcaRegno,String address,String age,Long areaId,String birthday,Long cellId,String dca,String department,String editor,String firstTime,String gender,String maritalStatus,String memberEmail,Long memberHomePhoneNum,Long memberMobileNum,String memberName,String note,String secondTime) {
this.memberId = memberId;
this.dcaRegno = dcaRegno;
this.address = address;
this.age = age;
this.areaId = areaId;
this.birthday = birthday;
this.cellId = cellId;
this.dca = dca;
this.department = department;
this.editor = editor;
this.firstTime = firstTime;
this.gender = gender;
this.maritalStatus = maritalStatus;
this.memberEmail = memberEmail;
this.memberHomePhoneNum = memberHomePhoneNum;
this.memberMobileNum = memberMobileNum;
this.memberName = memberName;
this.note = note;
this.secondTime = secondTime;
}
}
我的用户实体:
*
*/
package com.app.ecclesiamainframe.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
//import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
//import org.springframework.security.authentication.encoding.PasswordEncoder;
import lombok.Data;
/**
* @author Harry
*
*/
@Entity
@Table(name="users_tb")
@Data
@SqlResultSetMapping(
name = "UserMapping",classes = @ConstructorResult(
targetclass = Users.class,columns = {
@ColumnResult(name = "userId",@ColumnResult(name = "username"),@ColumnResult(name = "password"),@ColumnResult(name = "name"),@ColumnResult(name = "permission")
}))
public class Users implements Serializable {
/**
*
*/
public Users() {}
private static final long serialVersionUID = 1L;
@Id
@Column(name="userId")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
@Column(name="name")
private String name;
@Column(name="areaId")
private Long areaId;
@Column(name="permission")
private String permission;
// public String getPassword() {
// return password;
// }
// public void setPassword(String password) {
// PasswordEncoder crypto = new Md5PasswordEncoder();
// this.password = crypto.encodePassword(password,null);
// }
public Users(Long userId,String username,String password,String name,String permission) {
this.userId = userId;
this.username = username;
this.password = password;
this.name = name;
this.areaId = areaId;
this.permission = permission;
}
}
我的MemberServiceImpl:
*
*/
package com.app.ecclesiamainframe.service.impl;
import java.util.List;
import java.util.Optional;
import javax.persistence.Query;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import com.app.ecclesiamainframe.dao.MembersDao;
import com.app.ecclesiamainframe.entity.Members;
import com.app.ecclesiamainframe.service.MembersService;
import com.app.ecclesiamainframe.util.HibernateUtil;
/**
* @author Harry
*
*/
@Service
public class MembersServiceImpl implements MembersService {
Session session = null;
Transaction transaction = null;
@Autowired
private MembersDao membersDao;
public MembersServiceImpl() {
super();
}
@Transactional
public Members saveMember(Members member) {
// TODO Auto-generated method stub
return membersDao.save(member);
}
@Transactional
public Members updateMembers(Members member) {
// TODO Auto-generated method stub
return membersDao.saveAndFlush(member);
}
@Transactional
@SuppressWarnings("unchecked")
public List<Members> findByMembername(String memberName)
{
//return membersDao.findByMemberName(memberName);
List<Members> members = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
// Native query selecting all columns
Query query = session.createNativeQuery("SELECT * FROM members_tb where memberName like :memberName","MemberMapping")
.setParameter("memberName","%"+memberName+"%"); //named parameter binding
members = query.getResultList();
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
// HibernateUtil.shutdown();
return members;
}
@Transactional
public List<Members> getMembers() {
// TODO Auto-generated method stub
return membersDao.findAll();
}
@Transactional
public Optional<Members> getMember(Long memberId) {
// TODO Auto-generated method stub
return membersDao.findById(memberId);
}
@Transactional
public void deleteMember(Long memberId) {
// TODO Auto-generated method stub
membersDao.deleteById(memberId);
}
}
我的UserServiceImpl:
*
*/
package com.app.ecclesiamainframe.service.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import javax.persistence.Query;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.hibernate.Session;
import org.hibernate.Transaction;
//import org.primefaces.component.inputtext.InputText;
//import org.springframework.security.core.GrantedAuthority;
//import org.springframework.security.core.authority.SimpleGrantedAuthority;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UsersService;
//import org.springframework.security.core.userdetails.usernameNotFoundException;
import org.springframework.stereotype.Service;
import com.app.ecclesiamainframe.dao.UsersDao;
import com.app.ecclesiamainframe.entity.Users;
import com.app.ecclesiamainframe.service.UsersService;
import com.app.ecclesiamainframe.util.HibernateUtil;
/**
* @author Harry
*
*/
@Service
public class UsersServiceImpl implements UsersService {
Session session = null;
Transaction transaction = null;
@Autowired
private UsersDao usersDao;
public UsersServiceImpl() {
super();
}
@Transactional
public Users saveUser(Users user) {
// TODO Auto-generated method stub
return usersDao.save(user);
}
@Transactional
public Users updateUser(Users user) {
// TODO Auto-generated method stub
return usersDao.saveAndFlush(user);
}
@Transactional
public List<Users> getUsers() {
// TODO Auto-generated method stub
return usersDao.findAll();
}
@Transactional
public Optional<Users> getUser(Long userId) {
// TODO Auto-generated method stub
return usersDao.findById(userId);
}
@Transactional
public void deleteUser(Long userId) {
// TODO Auto-generated method stub
usersDao.deleteById(userId);
}
//@SuppressWarnings("unchecked")
@Transactional
public Users findByusername(String username) {
//return usersDao.findByMemberName(memberName);
Users users = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
// Native query selecting all columns
Query query = session.createNativeQuery("SELECT * FROM users_tb where username like :username","UserMapping")
.setParameter("username","%"+username+"%"); //named parameter binding
users = (Users) query.getSingleResult();
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
// HibernateUtil.shutdown();
return users;
}
我的问题是
我有几个实体,例如成员,用户,课程,并且我为每个类设计了一个SqlResultSetMapping文件。但是当我测试我的API时,只有Member类获得正确的响应和映射,用户实体服务实现返回未知的SqlResultSetMapping [UserMapping] ...