java jpa查询没有id的表的方法

一、前言

jpa中,如果想查询数据库,必须有一个@Entity实体类,这个类的内容要与数据库表的列一一对应;

并且这个类中,必须有一个Long id字段,对应数据库表中的id列。

a 复制代码
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

但是,本人的项目里有个数据库表,确实没有id这一列,有的是class_id这一列,名字不一样。

a 复制代码
CREATE TABLE `classinfo` (
  `class_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `class_name` varchar(200) NOT NULL DEFAULT '' COMMENT 'name',
  PRIMARY KEY (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

这种情况,使用jpa查询就会报错,找不到id列(确实没有)

即使改@Entity代码,改为:

a 复制代码
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long classId;

这样也是不行的,查询也会报错(名字必须叫id)

表结构确实不能修改,查询又必须使用jpa,但是没有id列又不行......

二、解决方法

1.可以先建一个空表,只有一个id列,例如:

a 复制代码
CREATE TABLE `simpletable` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.然后写一个@Entity实体类,与空表simpletable对应,只有一个id列,例如:

a 复制代码
import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

/**
 * A Simpletable.
 */
@Entity
@Table(name = "simpletable")
public class Simpletable implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Simpletable simpletable = (Simpletable) o;
        if (simpletable.getId() == null || getId() == null) {
            return false;
        }
        return Objects.equals(getId(), simpletable.getId());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getId());
    }

    @Override
    public String toString() {
        return "Simpletable{" +
            "id=" + getId() +
            "}";
    }
}

3.然后写一个repository类,放入这个实体类,然后查询其它表,如下:

a 复制代码
import xxx.Simpletable;
import org.springframework.data.jpa.repository.*;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;


/**
 * Spring Data  repository for the Classinfo entity.
 */
@SuppressWarnings("unused")
@Repository
public interface ClassinfoRepository extends CrudRepository<Simpletable, Long> {

    @Query(value = "select * " +
            " from classinfo  " +
            "where class_id = ?1 " +
            "order by  class_id DESC ", nativeQuery = true)
    List<Map<String,Object>> findByClassId(String id);
    
}

(1)这段代码里,主要是在extends CrudRepository<Simpletable, Long>这里放入了Simpletable(必须放一个与表对应的实体类,否则执行查询还是会报错)

(2)然后,在这个类中去查询没有id列的表classinfo

(3)由于classinfo表没有实体类(没有id列,无法写实体类),所以只能返回 List<Map<String,Object>>类型,后续需要自己拆分获取字段。

(4)这样,就实现了jpa查询没有id的表的方法。

三、备注

1.注意返回类型不能写成List<HashMap<String,Object>>,会无法正常获取key-value

2.如果使用jpa,最好是建表的时候就建一个id列作为自增主键。

相关推荐
软件黑马王子8 分钟前
Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
开发语言·unity·c#
张太行_9 分钟前
Qt Creator 设计界面后的预览方法
开发语言·qt
视觉CG13 分钟前
【Viewer.js】vue3封装图片查看器
开发语言·javascript·vue.js
h^hh19 分钟前
洛谷 P3405 [USACO16DEC] Cities and States S(详解)c++
开发语言·数据结构·c++·算法·哈希算法
qwy71522925816326 分钟前
20-R 绘图 - 饼图
开发语言·数据库·r语言
java1234_小锋26 分钟前
一周学会Flask3 Python Web开发-redirect重定向
前端·python·flask·flask3
重生之我要成为代码大佬26 分钟前
Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和
开发语言·数据结构·python·算法
Daitu_Adam31 分钟前
Windows11安装GPU版本Pytorch2.6教程
人工智能·pytorch·python·深度学习
阿正的梦工坊34 分钟前
Grouped-Query Attention(GQA)详解: Pytorch实现
人工智能·pytorch·python
琑9544 分钟前
nextjs项目搭建——头部导航
开发语言·前端·javascript