获取结果集中的列名Spring数据JPA

时间:2017-09-12 08:13:56

标签: java spring hibernate jpa

我有一个简单的程序,列出了用户。我使用@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;
    }
}

我需要列名称的结果。

3 个答案:

答案 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 中使用列名作为占位符,其中值将在运行时替换它,这将非常有用。