Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@JoinTable和SQLQuery获取联接_Java_Tsql_Hibernate_Left Join - Fatal编程技术网

Java 使用@JoinTable和SQLQuery获取联接

Java 使用@JoinTable和SQLQuery获取联接,java,tsql,hibernate,left-join,Java,Tsql,Hibernate,Left Join,我有一个带有属性“latestHistory”的映射实体,该属性通过联接表映射,如: class Record { @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY, optional = true) @JoinTable(name = "latest_history_join_view", joinColumns = {

我有一个带有属性“latestHistory”的映射实体,该属性通过联接表映射,如:

class Record {

  @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY, optional = true)
  @JoinTable(name = "latest_history_join_view", joinColumns = { @JoinColumn(name = "record_id") }, inverseJoinColumns = { @JoinColumn(name = "history_id") })
  @AccessType("field")
  public History getLatestHistory() { ... }
}
调用myRecord.getLatestHistory()时,映射工作正常

我有一个复杂的本机SQL查询,它返回一批记录,并使用联接表联接每个记录的历史记录。我想从查询中返回记录实体,并在结果中填充历史对象。我的尝试如下所示:

StringBuffer sb = new StringBuffer();
sb.append("select {r.*}, {latestHistory.*}");
sb.append(" from record r");
sb.append(" left join latest_history_join_view lh on lh.record_id = r.record_id");
sb.append(" left join history latestHistory on latestHistory.history_id = lh.history_id");
SQLQuery query = session.createSQLQuery(sb.toString());
query.addEntity("r", Record.class).addJoin("latestHistory", "r.latestHistory");
当我这样做时,它会生成如下查询:

select 
   r.record_id, r.name..., 
   r_1.history_id,  --this part is wrong; there is no such alias r_1 
   latestHistory.history_id, latestHistory.update_date, ...
 from record r
 left join latest_history_join_view lh on lh.record_id = r.record_id
 left join history latestHistory on latestHistory.history_id = lh.history_id
我怎样才能让它正确地加入并获取我的关联,而不会弄乱选择列表

[更新:我尝试过的一些方法:

select {r.*}, {latestHistory.*} -> SQL error, generates a wrong column name "r_1.history_id"
select {r.*}, {anyOtherEntityAssociatedToR.*} -> wrong column name (as above)
select {r.*}, {r.history_id}, {latestHistory.*} -> hibernate error, r has no history_id column
select r.*, lh.history_id as history_id -> this works (though hackish), but doesn't accomplish the join
select r.*, lh.history_id as history_id, latestHistory.* -> appears correct, but results in column name collisions
select r.*, {latestHistory.*} -> error when hibernate looks for a nonexistent column in the result set (this happens if there is any alias at all in the select list)
无论我使用addEntity(…)还是addJoin(…),只要最左边的(根)实体是使用addEntity添加的,似乎没有多大区别


]

我认为您实际上需要在
选择中为您的
最新历史记录指定完整路径,例如

select {r.*}, {r.latestHistory.*}
否则Hibernate会感到困惑,并试图将其作为一个单独的实体来处理。另一个选项是,只要表中的列顺序与实体中的属性顺序匹配,就不在
select
中指定注入的别名


不过,我从未在@OneToOne over association table上尝试过这一点。

我认为您实际上需要在
选择中为您的
最新历史记录指定完整路径

select {r.*}, {r.latestHistory.*}
否则Hibernate会感到困惑,并试图将其作为一个单独的实体来处理。另一个选项是,只要表中的列顺序与实体中的属性顺序匹配,就不在
select
中指定注入的别名


不过,我从未在@OneToOne上通过关联表尝试过此功能。

谢谢,Chss-我正在尝试r.latestHistory.*。如果不指定注入的别名,我怎么做呢?只要列/属性顺序匹配,就应该能够执行
select r.*,latestHistory.*
-也就是说,使用SQL别名而不是注入的别名。使用{r.latestHistory.*},我得到:org.hibernate.QueryException:找不到属性[latestHistory.]的列名对于alias[r],我认为关联表上的一对一是这里问题的根源;尝试在没有注入别名的情况下执行此操作,但如果这不起作用,您可能必须求助于选择它们作为独立实体()。因此,基本上,您的原始选择是使用第二个
addEntity()
而不是
addJoin()
。正如我所说,我从来没有在关联表上做过这种映射,所以我不是根据这里的经验:-)谢谢,Chss-我正在尝试r.latestHistory.*。如果不指定注入的别名,我怎么做呢?只要列/属性顺序匹配,就应该能够执行
select r.*,latestHistory.*
-也就是说,使用SQL别名而不是注入的别名。使用{r.latestHistory.*},我得到:org.hibernate.QueryException:找不到属性[latestHistory.]的列名对于alias[r],我认为关联表上的一对一是这里问题的根源;尝试在没有注入别名的情况下执行此操作,但如果这不起作用,您可能必须求助于选择它们作为独立实体()。因此,基本上,您的原始选择是使用第二个
addEntity()
而不是
addJoin()
。正如我所说,我从来没有在关联表上进行过这种映射,所以我不是根据这里的经验:-)找到了一种使用HQL执行整个查询的方法(HQL left join fetch工作正常;“left join”在执行聚合查询时没有“fetch”)。我无法找到此本机SQL问题的完全有效的解决方案。找到了使用HQL执行整个查询的方法(HQL left join fetch工作正常;“left join”在执行聚合查询时不使用“fetch”)。我无法找到一个完全有效的解决方案来解决这个本机SQL问题。