关于spring data jpa的@Query原生查询问题

System.out.println 2020-03-26 02:32:17
    @Query(value = "select id,appid,name,logo_url ,url,phone,introduce,description from t_org where id=?1", nativeQuery = true)
Org findSimpleOrg2(Integer orgId);

这个是我repository的查询语句
报错是报:Column 'app_secret' not found.
    @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String appid;
private String appSecret;
private String mchid;
private String mchSecret;
private String name;//名称
private BigDecimal balance;//账号预存款余额
private Date createdTime;
private Date updatedTime;
private String logoUrl;//图标url
private String url;//首页链接
private String qrcodeUrl;//二维码url
private String phone;//联系电话
private String businessLicense;//营业执照
private String username;//登陆账号
private String introduce;//关于我们
private String description;//描述
private String uploadVerify;//上传验证文件路径

这个是我实体类的属性

问题:我这个查询语句是没有涉及到 app_secret 这个字段的呀,为什么会报这个错呢?
ps:如果是select * from table 是不会报这种错的
我就觉得是封装实体类属性的时候出了错,但是不知道要怎么解决,需求就是我要执行上面的SQL语句

...全文
535 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
伱給的囘憶 2020-08-07
  • 打赏
  • 举报
回复
引用 13 楼 System.out.println 的回复:
[quote=引用 12 楼 dkwuxiang 的回复:]关键是构造函数,返回的对象是实体的话,是需要相对应的构造函数来 实例化对象的
我的需求是,我有个实体类,有10个字段,然后,我只需要查询其中的5个字段。但是,这样查是报错的。 所以,我是要构造一个构造函数来封装对应的字段?那么,我每次查询的需求都不一样,那是不是每个字段都要来一个构造函数?[/quote]就和你上面说的用个Map来接收查询结果就能解决这问题,也可以用JSONObject,甚至直接用Object也行的
大隐藏于寺 2020-08-07
  • 打赏
  • 举报
回复
方法一: 使用@Query,但NativeQuery为false,下面的sql中字段是Org类中的属性,使用"o.属性名"来设置需要查询的属性.
    @Query(value = "select o.id,o.appid,o.name,o.logoUrl,o.url,o.phone,o.introduce,o.description from Org o where o.id=?1")
    Org findSimpleOrg2(Integer orgId);
方法二: 使用 Projection,这里有Spring Data JPA 官网Projection介绍,创建一个OrgProjection接口,里面包含所需属性的get方法,可以把Org中的get方法复制过去,由于我不知道Org类中各个属性的类型,我就随便写了,代码如下,
public interface OrgProjection {

    Integer getId();

    String getAppid();

    String getName();

    String getLogoUrl();

    String getUrl();

    String getPhone();

    String getIntroduce();

    String getDescription();
}
Repository中的方法

 OrgProjection  findSimpleOrg1(Integer orgId);
使用这种方法,如果需要的不同属性的情况很多,比如:三个字段,四个字段,五个字段,那么就要有相应的Projection接口,里面有三个字段的get方法,四个字段的get方法,五个字段get方法. 也可以使用 Dynamic Projection Repository中的方法

 <T> T findSimpleOrg1(Integer orgId, Class<T> type);
方法三: 使用你之前说的 Map<String, Object> findSimpleOrg1(Integer orgId);
java_入门级 2020-08-07
  • 打赏
  • 举报
回复
你数据库对应的这个字段是怎么命名的,是这个 app_secret 样子吗?不是的话,把你的实体类appSecrt,改为appsecrt
Spinach007 2020-08-06
  • 打赏
  • 举报
回复
部分查询用视图接口来接收吧
System.out.println 2020-08-06
  • 打赏
  • 举报
回复
引用 12 楼 dkwuxiang 的回复:
关键是构造函数,返回的对象是实体的话,是需要相对应的构造函数来 实例化对象的
我的需求是,我有个实体类,有10个字段,然后,我只需要查询其中的5个字段。但是,这样查是报错的。 所以,我是要构造一个构造函数来封装对应的字段?那么,我每次查询的需求都不一样,那是不是每个字段都要来一个构造函数?
dkwuxiang 2020-03-27
  • 打赏
  • 举报
回复
关键是构造函数,返回的对象是实体的话,是需要相对应的构造函数来 实例化对象的
System.out.println 2020-03-27
  • 打赏
  • 举报
回复
要结贴了,对于这种查询某几个字段的sql,先用map接收查询结果,然后进行空值的处理(必须要进行处理,否则某个字段有空值会报错),最后根据需求进行参数封装
    @Query(value = "select id,appid,name,logo_url logoUrl,url,phone,ifnull(introduce,'') introduce,ifnull(description,'') description\n " +
            "from t_org where id=?1 ", nativeQuery = true)
    Map<String, Object> findSimpleOrg1(Integer orgId);
Map<String, Object> result = orgRepository.findSimpleOrg1(1623);
String json = JSONObject.toJSONString(result);
Org testOrg = JSONObject.parseObject(json, Org.class);
System.out.println 2020-03-26
  • 打赏
  • 举报
回复
引用 9 楼 这该死か℡命运 的回复:
[quote=引用 8 楼 System.out.println的回复:][quote=引用 6 楼 这该死か℡命运 的回复:] [quote=引用 4 楼 System.out.println的回复:][quote=引用 3 楼 这该死か℡命运 的回复:] 你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?[/quote] 你得报错是没找到这个值,sql语句想咋查就咋查啊[/quote] 我知道报错是这样原因呀,但是我就是一个简单的sql查询而已,我也没有查询这个字段,只不过这个字段是在表里面而已[/quote] 我知道啊,,,,你是查了除这之外的字段,,[/quote] 我还有其他字段也是没有查的,但是也很奇怪呀,为什么不查这个字段就会有问题呢?查了这个app_secret没有查其他,是不是也会报同样的错呢?
  • 打赏
  • 举报
回复
引用 8 楼 System.out.println的回复:
[quote=引用 6 楼 这该死か℡命运 的回复:] [quote=引用 4 楼 System.out.println的回复:][quote=引用 3 楼 这该死か℡命运 的回复:] 你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?[/quote] 你得报错是没找到这个值,sql语句想咋查就咋查啊[/quote] 我知道报错是这样原因呀,但是我就是一个简单的sql查询而已,我也没有查询这个字段,只不过这个字段是在表里面而已[/quote] 我知道啊,,,,你是查了除这之外的字段,,
System.out.println 2020-03-26
  • 打赏
  • 举报
回复
引用 6 楼 这该死か℡命运 的回复:
[quote=引用 4 楼 System.out.println的回复:][quote=引用 3 楼 这该死か℡命运 的回复:] 你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?[/quote] 你得报错是没找到这个值,sql语句想咋查就咋查啊[/quote] 我知道报错是这样原因呀,但是我就是一个简单的sql查询而已,我也没有查询这个字段,只不过这个字段是在表里面而已
Chan_kwen 2020-03-26
  • 打赏
  • 举报
回复
你在实体类中写个构造函数,构造函数里面加上你sql查出来的字段试试。
  • 打赏
  • 举报
回复
引用 4 楼 System.out.println的回复:
[quote=引用 3 楼 这该死か℡命运 的回复:] 你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?[/quote] 你得报错是没找到这个值,sql语句想咋查就咋查啊
  • 打赏
  • 举报
回复
引用 4 楼 System.out.println的回复:
[quote=引用 3 楼 这该死か℡命运 的回复:] 你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?[/quote] 你得报错是没找到这个值,sql语句想咋查就咋查啊
System.out.println 2020-03-26
  • 打赏
  • 举报
回复
引用 3 楼 这该死か℡命运 的回复:
你这个字段是不能为空吧
报错信息是这样说,但是查询没有规定要哪个字段必须查的吧?
  • 打赏
  • 举报
回复
你这个字段是不能为空吧
  • 打赏
  • 举报
回复
这sql语句我看没毛病啊,莫非xml文件 关于app-secret字段 查询 为null? 逻辑错误?
System.out.println 2020-03-26
  • 打赏
  • 举报
回复
网上有些人说是用 select * from table 这种查询语句来解决上面的问题,但是我的需求并不是这样的呀,而是只查询我需要的字段

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧