Uso conjunto de visualização de objeto de banco de dados, procedimento armazenado e Spring Data JPA

1. Visualização de acesso JPA

Como a visão é uma tabela virtual, o acesso da visão é semelhante ao da tabela geral. Os dados do banco de dados são mostrados na figura a seguir:

Insira a descrição da imagem aqui
O código de implementação específico é o seguinte:
Defina a visualização:

create view view_users 
as
select*from user

Classe modelo:

@Entity
@Table(name="view_users")
@Data
public class User implements Serializable {
    
    
	private static final long serialVersionUID = 1L;
	@Id
	private String id;
	private String name;
	private String password;
	private String sex;
}

Interface do repositório:

public interface UserRepository extends JpaRepository<User, String> {
    
    
	@Query(value="select*from view_users",nativeQuery=true)
	List<User> findUserByUserView();
}

Interface de serviço e implementação:

public interface IUserService {
    
    
	public List<User> findUsers();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    

	@Autowired
	private UserRepository userRepository;
 
	@Override
	public List<User> findUsers() {
    
    
		List<User> users=userRepository.findUserByUserView();
		return users;
	}
}

Classe do controlador:

@RestController
public class UserController {
    
    
	@Autowired
	@Qualifier(value="userService_entityManager")
	private IUserService userService;

	@RequestMapping(value="/users",method=RequestMethod.GET)
	public ResponseEntity<List<User>> findUsers(){
    
    
		return ResponseEntity.ok(userService.findUsers());
	}
}

Resultados de:

[{"id":"001","name":"rhine","password":"28e5ea71eb6600afb02132dcf27b8e75","sex":null},{"id":"002","name":"xixi","password":"xxxx","sex":null}]

2. JPA acessa o procedimento armazenado

2.1, um procedimento armazenado que retorna um conjunto de resultados

Defina o procedimento armazenado:

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_users`()
BEGIN
	SELECT *FROM user;
END

Classe modelo:

@Data
@Entity
@NamedStoredProcedureQuery(
			name = "user.list", 
			procedureName = "proc_users",
			resultClasses= {
    
    UserProcParam.class})
public class UserProcParam{
    
    
	@Id
	private String id;
	@Column(name="name")  // 
	private String userName;
	private String password;
	private String sex;
}

Como os campos em nossa classe de entidade são inconsistentes com os campos no banco de dados, existem duas maneiras de resolvê-los:
Primeiro: use @Column (name = "[nome do campo no banco de dados]")
Segundo: Use a anotação @SqlResultSetMapping, a implementação específica é a seguinte:

@Data
@Entity
@NamedStoredProcedureQuery(
			name = "user.list", 
			procedureName = "proc_users",
			resultSetMappings= "userMapping"
	)
@SqlResultSetMapping(
		name="userMapping",
		entities= {
    
    @EntityResult(entityClass=UserProcParam.class,fields= {
    
    
				@FieldResult(name="id",column="id"),
				@FieldResult(name="userName",column="name"),
				@FieldResult(name="password",column="password"),
				@FieldResult(name="sex",column="sex"),
				})}
)
public class UserProcParam{
    
    
	@Id
	private String id;
	private String userName;
	private String password;
	private String sex;
}

Interface da camada de serviço e classe de implementação:

public interface IUserService {
    
    	
	public List<UserProcParam> findUsersByProc();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    
    @PersistenceContext
    private EntityManager entityManager;

	@Override
	public List<UserProcParam> findUsersByProc() {
    
    
		StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("user.list");
		List<UserProcParam> list=store.getResultList();
		return list;
	}

A classe de implementação da camada do controlador é omitida aqui.

2.2, um procedimento armazenado que retorna um único valor

Defina um procedimento armazenado

CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`(OUT num INT)
BEGIN
	DECLARE number int;
	SELECT COUNT(*) INTO number FROM user;
	SET num=number;
END

Classe modelo:

@Data
@Entity
@NamedStoredProcedureQuery(name="user.count",procedureName="proc_users_total",parameters= {
    
    
		@StoredProcedureParameter(mode=ParameterMode.OUT, name="num", type=Integer.class)
	})
public class UserProcParam{
    
    
	@Id
	private String id;
	@Column(name="name")
	private String userName;
	private String password;
	private String sex;
}

Interface da camada de serviço e classe de implementação:

public interface IUserService {
    
    
	int findUsersCountByProc();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    
    @PersistenceContext
    private EntityManager entityManager;
   
	@Override
	public int findUsersCountByProc() {
    
    
		StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("user.count");
		int count=(int) store.getOutputParameterValue("num");
		return count;
	}
}

A camada do controlador é omitida.

Acho que você gosta

Origin blog.csdn.net/qgnczmnmn/article/details/109331635
Recomendado
Clasificación