【问题标题】:Hibernate query inner join on unmapped table (unidirectional)未映射表上的休眠查询内部联接(单向)
【发布时间】:2011-10-26 12:32:10
【问题描述】:

我确实遇到了 spring 和 hibernate 的查询问题。

我有一个名为 Car 的类,它将 ManyToMany 映射到我的类 Inventory。顺便说一句,Inventory 没有对 Car 类的引用。 这会导致 spring 和 hibernate 创建映射表 car_loading,其中一个 fk 指向 car,一个 fk 指向 inventory 表。

我现在想查询一辆特殊汽车的库存:

String squery = "SELECT i from Inventory i, car_loading loads WHERE i.id = loads.loading AND car = ?";

但我得到了例外

org.hibernate.hql.ast.QuerySyntaxException: car_loading is not mapped

仅供参考:Hibernate 不支持 JOIN ON x.a = y.b 导致我这样做...

提前感谢旅馆的任何帮助!

编辑 - 我的映射

public class Car {

    @OneToOne
    private Driver driver;

    @ManyToMany(cascade=CascadeType.ALL)
    private List<Inventory> loading = new ArrayList<Inventory>();   

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="dd:MM:yyy HH:mm")
    private Date lastModified;
    //...
}

public class Inventory {

    private Integer shouldAmount;

    private Integer minAmount;

    private Integer isAmount;

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="dd:MM:yyy HH:mm")
    private Date lastModified;
    //..
}

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    你不应该显式地使用映射表,当你使用实体的属性时,hibernate 会自动添加它。 对于您的情况,查询应如下所示:

    "select c.loading from Car c where c = ?"
    

    或者只是得到一个汽车对象Car car = session.get(Car.class, id),然后像往常一样使用getter Collection&lt;Inventory&gt; loading = car.getLoading();

    【讨论】:

    • 我不能使用 c.loading,因为加载不是 Car 中的字段,导致未知字段加载异常。那是我的问题,参考是单向的
    • 请显示您的课程和映射。
    • 嗯,我似乎仍然有这个问题。尝试使用连接的本机查询,但我的生产服务器有问题,我已经发布了我的映射......
    • Car.loading 是一个多对多字段。为什么不为人知?你使用 HQL 吗?这是休眠的非常基本的用例。也许你在基础设施代码中做错了什么。尝试编写一个最小的测试用例。
    【解决方案2】:

    我看到了这个问题并想更新它。我做错了。我可以简单地查询这辆车并返回这辆车内的所有库存。因为汽车与库存之间存在关系,但反之则不然。所以查询特定的汽车并简单地返回库存列表属性为我做了...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多