有两个表的JPA @NamedQuery可能吗?

时间:2009-12-22 02:49:11

标签: java jpa named-query

我遇到了一个虚拟问题,我需要通过与其他表的连接来创建 @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)

任何提示?

提前致谢

4 个答案:

答案 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;