我有一个简单的程序,列出了用户。我使用@NamedStoredProcedureQueries
进行过程声明,并将EntityManager.createNamedStoredProcedureQuery
用于StoredProcedureQuery
。
它正确返回结果,但我需要列名,以便我知道哪个列是哪个值。
我的代码就是这样的
实体类
@Entity
@NamedStoredProcedureQueries({ @NamedStoredProcedureQuery(name =
"sGetUserList", procedureName = "sGetUserList", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "user_id", type =
Integer.class) })
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String email;
//getters and setters
}
自定义存储库
public interface UserRepositoryCustom {
List<?> testProc() ;
}
存储库
public interface UserRepository extends JpaRepository<User, Long>,
UserRepositoryCustom{
}
存储库实施
public class UserRepositoryImpl implements UserRepositoryCustom{
@PersistenceContext
EntityManager em;
public List<Object> testProc() {
StoredProcedureQuery q = em.createNamedStoredProcedureQuery("sGetUserList");
q.setParameter("user_id", 1);
List<Object> res = q.getResultList();
return res;
}
}
我需要列名称的结果。
答案 0 :(得分:1)
在这里,我编写了一个方法,可以从中获取JSON,还可以从列和值的键值对中获取
@Transactional
@Component
public class CustomRepository<T> {
@Autowired
private EntityManager em;
private ObjectMapper mapper = new ObjectMapper();
public List<T> getResultOfQuery(String argQueryString,Class<T> valueType) {
try {
Query query = em.createNativeQuery(argQueryString);
NativeQueryImpl nativeQuery = (NativeQueryImpl) query;
nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String,Object>> result = nativeQuery.getResultList();
List<T> resultList = result.stream()
.map(o -> {
try {
return mapper.readValue(mapper.writeValueAsString(o),valueType);
} catch (Exception e) {
ApplicationLogger.logger.error(e.getMessage(),e);
}
return null;
}).collect(Collectors.toList());
return resultList;
} catch (Exception ex) {
ApplicationLogger.logger.error(ex.getMessage(),ex);
throw ex;
}
}
}
唯一的条件是您的查询和pojo属性名称应相同
答案 1 :(得分:0)
我不确定我明白你在这里要做什么。如果您想让所有用户使用Spring数据,您不应该实现您的UserRepository。 Spring Data为您做到这一点。
事实上,JpaRepository已经拥有了你需要的方法。
@Autowire
UserRepository userRepository;
List<Users> allUsers = userRepository.findAll();
您可以调用它来获取所有用户的列表,并且不必担心列名称。
只需将存储库注入您需要的位置,然后调用该方法以获取所有用户:
public interface UserRepository extends JpaRepository<User, Long>{
@Procedure(name = "sGetUserList")
List<User> sGetUserList(@Param("user_id") Integer userId);
}
编辑:如果有一个特殊的原因你想使用存储过程,尽管有一种Spring Data方法可以自己实现UserRepository。您可以通过定义以下方法来完成此操作:
public function create() {
//check if user is logged in
if (!$this->session->userdata('logged_in')) {
redirect('users/login');
}
$this->form_validation->set_rules('mjestoPolaska', 'Mjesto Polaska', 'required');
$this->form_validation->set_rules('mjestoOdredista', 'Mjesto Odredista', 'required');
$this->form_validation->set_rules('datumPolaska', 'Datum Polaska', 'required');
$this->form_validation->set_rules('datumPovratka', 'Datum Povratka', 'required');
$this->form_validation->set_rules('cijena', 'Cijena', 'required');
$this->form_validation->set_rules('brojMjesta', 'Broj mjesta', 'required');
$this->form_validation->set_rules('opis', 'Opis', 'required');
$data['title'] = 'Create Posts';
$data['categories'] = $this->Posts_model->get_categories();
if ($this->form_validation->run() === FALSE) {
$this->session->set_flashdata("error", validation_errors());
$this->load->view('templates/header');
$this->load->view('posts/create', $data);
$this->load->view('templates/footer');
} else {
$post_image='';
if (!empty($_FILES['userfile']['name'])) {
$path = 'assets/images/posts/';
$post_image = $this->ImageUpload($path, 'userfile', '');
if (!is_array($post_image)) {
$this->session->set_flashdata('error', $post_image);
redirect(site_url() . 'posts/create');
}
$post_image = $post_image['file_name'];
}
$this->Posts_model->create_post($post_image);
$this->session->set_flashdata('post_creted', 'You post has been created');
redirect('posts');
}
}
再次使用此方法解决列名称不应该有任何问题。
答案 2 :(得分:0)
您可以在 Map 中获取列名称及其值。即Map<'column-name', value>
。
Query query = entityManager.createNativeQuery("{call <<Your procedure>>}");
NativeQueryImpl nativeQuery = (NativeQueryImpl) query;
nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String,Object>> result = nativeQuery.getResultList();
如果您想在 HTML 中使用列名作为占位符,其中值将在运行时替换它,这将非常有用。