我遇到了一个虚拟问题,我需要通过与其他表的连接来创建 @NamedQuery
,这很简单。
但在我的所有@NamedQuery
我只处理我的映射对象/表。
例如在我的对象/表格映射的汽车中:
@NamedQuery(name = Cars.GET_AVAILABLE_CARS,
query = "select c.id from Cars c where c.status = (select d.status from CarStatus d where d.color=red)")
我正在尝试使用: @SecondaryTables
但暂时没有成功。
另一个有效的方法是将其他表中的所有内容作为参数提供,但我认为这不会对性能有好处。
像:
@NamedQuery(name = Cars.GET_AVAILABLE_CARS, query =
"select c.id from Cars c where c.status = :" + CarStatusParam)
任何提示?
提前致谢
答案 0 :(得分:2)
命名查询可以使用API查询可以使用的所有内容,因此可以清楚地执行子查询。 JPA的哪个实现?
答案 1 :(得分:1)
您要做的不是加入。这是一个次级选择。就性能而言,它与预先获得参数一样有效。
但是,如果您坚持使用子选择,则JPA查询语言支持它。因为它支持连接。
Take a look here(在 7.11 8.11。子查询)。
答案 2 :(得分:1)
我猜你有这样的事情:
@Entity
public class Cars{
private String status;
//... something else
}
@Entity
public class CarStatus{
private String status;
private String color;
//... something else
}
如果是,请更改此
@Entity
public class Cars{
private CarStatus status; //<--THIS!!
//... something else
}
@Entity
public class CarStatus{
private String color;
//... something else
}
然后将NamedQuery更新为:
query ="select c.id from Cars c where c.status.color = 'red'"
如果我错了并且表格不应该以这种方式相关,那么您应该更改查询,使用连接而不是子查询。像这样:
query = "select c.id from Cars c join CarStatus d where c.status = d.status and d.color = 'red'"
答案 3 :(得分:0)
答案是肯定的。您需要确保您的列定义了要查看的表。请参见下面的代码,您命名的查询应该在添加之后起作用。
@Column(table = "SECONDARY_TABLE", name = "EXAMPLE_COLUMN_NAME")
private String example;