2009-12-22 115 views
0

我有一种虚假的问题,我需要做一个@NamedQuery与其他表,一些简单的事情加入。JPA @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

除非您可以使用继承,@SecondaryTable或映射你的对象映射到第二个表(@OneToOne,...),那么你将不得不使用@NamedNativeQuery。为了进一步帮助您,我需要更多地了解表结构以及您正在使用的JPA提供程序(例如,EclipseLink具有可以实现此功能的扩展,并允许您使用存储过程(@NamedStoredProcedureQuery))。 – 2009-12-23 09:00:34

+0

查询有什么问题? Cars和CarSatus如何定义和映射? 'd.color = red'无效。 'd.color ='red''可能是正确的。 – 2013-07-26 06:47:15

回答

2

命名查询可以使用一个API查询可以使用一切,所以可以清楚地做子查询。 JPA的哪个实现?

1

你试图做的不是连接。这是一个子选择。就性能而言,它与预先得到参数一样有效。

但是,如果您坚持要使用子查询,那么JPA查询语言会支持它。因为它支持连接。 Take a look here(在 7.11 8.11子查询)。

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'" 

如果我错误和表不应该这样相关,那么你应该改变你的查询tu使用联接,而不是子查询。事情是这样的:

query = "select c.id from Cars c join CarStatus d where c.status = d.status and d.color = 'red'"