【问题标题】:Hibernate native sql join queryHibernate 原生 sql 连接查询
【发布时间】:2016-10-11 10:46:48
【问题描述】:

我遇到了休眠原生 sql 连接查询的问题。我的查询如下,适用于 Mysql db。

SELECT c.cart_id, u.name, u.surname, c.totalPrice
FROM sandbox.cart c JOIN
     sandbox.user u
     ON u.id = c.placedBy

我在代码中使用休眠,遇到异常

java.sql.SQLException: Column 'id' not found.
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1093)

在此处查询代码

Session session = hibernateUtil.getSessionFactory().getCurrentSession();
        SQLQuery query = session.createSQLQuery(ORDER_PER_USER_QUERY);
        query.addEntity(OrderPerUser.class);
        return query.list();

表格列名

购物车

|购物车 ID |放置者 |总价

用户

|编号 |电子邮件 |姓名 |姓氏

我的映射类是

   @Entity
public class OrderPerUser {
@Id
private long id;
private String name;
private String surName;
private long cartId;
private double totalPrice; }

【问题讨论】:

  • 我已经添加了一个映射类。我添加了问题

标签: java mysql sql hibernate


【解决方案1】:

您需要删除该行:
query.addEntity(OrderPerUser.class);
之后,您需要重写代码并手动映射您的对象,因为您的 OrderPerUser 不是实体:

Session session = hibernateUtil.getSessionFactory().getCurrentSession();
    SQLQuery query = session.createSQLQuery(ORDER_PER_USER_QUERY);
    List<OrderPerUser> returnList new ArrayList<>();
    for(Object[] row : query.list()){
        OrderPerUser orderPerUserObj = new OrderPerUser();
        oderPerUserObj.setCartId(Long.parseLong(row[0].toString()));
        //put other properties here
        returnList.add(orderPerUserObj);
    }
    return returnList;

Edit1:现在我看到您添加了映射类,但 OrderPerUser 在您的情况下不应该是 entity,而是常规DTO。实体需要一个 ID,但在这种情况下您不能选择 ID,因为 OrderPerUser 不是表的一部分,它只是一些您想要在内存中而不是在数据库中的选定数据。因此,您应该将 OrderPerUser 设为常规数据传输对象。
请阅读实体、数据传输对象、数据访问对象以了解每个对象应该做什么。

【讨论】:

  • 我使用 OrderPerUser 类只映射列表结果。我只想在内存中返回列表。我不想持久化数据库。
  • 我没有在数据库中保存任何东西。我在这里所做的是返回所选信息的列表。数据库中不会保留任何内容,returnList 将保存您选择的信息,然后您可以根据需要将其放入缓存中或对其进行其他操作。我基本上做你想做的事。
  • 你现在有什么错误? SQLException 不应再出现,因为其根源在于您正在使用 query.addEntity(OrderPerUser.class)。你把那条线去掉了吗?你有没有让 OrderPerUser 不是一个实体,而是一个普通的对象?
  • 不,我没有删除。顺便说一句,如果我像这样更改查询中的列值-> SELECT u.id,u.name,u.surname,c.cart_id,c.totalPrice。 未找到列“cartId”的异常更改。是关于映射问题吗?
  • 在进行快乐映射之前,你必须了解 ORM 做什么和 ORM 不做什么。在您的情况下,实体不是解决方案。你没有一个表代表一个OrderPerUser。 OrderPerUser 只是在您的应用程序中,一个数据传输对象,而不是一个实体。如果不是这种情况,您需要停止映射到 ORM 实体。
【解决方案2】:

我的猜测是,您尝试用于收集结果的 OrderPerUser 类期望名称为 id 的列,而您的查询中没有这样的列...

尝试使用查询:

SELECT u.id, c.cart_id, u.name, u.surname, c.totalPrice
FROM sandbox.cart c 
     JOIN sandbox.user u ON u.id = c.placedBy

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2021-10-12
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多