2014-10-31 58 views
0

我是jpql的新手。 我有兩個mySql表。 表廣告:與列:jpql從表中選擇對象基於另一個表的某些屬性?

ID,名稱,描述,電話號碼,類別等。

並表advert_property與下列:

id   int 11 
advert_id int 11 
name  varchar 255 
value  varchar 255  
descr  varchar 255 

我的目標是選擇來自表advert的對象,其中有一個屬性category = "flats"寫在表advert屬性名稱number_rooms = "234"寫在表advert_property

我很困惑與JPQL大成一點點我來到這個解決方案:

Query q = em.createQuery("SELECT ap FROM AdvertProperty as ap, Advert as a " 
+ " where a.category= 'flats' and ap.advertId = a.id and ap.name='number_rooms' "); 

List<Advert> ads = q.getResultList(); 

但因爲我需要它不工作..

請建議, 感謝

廣告實體:

public class Advert implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
private Integer id; 
@Size(max = 255) 
private String title; 
@Lob 
@Size(max = 65535) 
private String content; 
private Integer price; 
@Size(max = 255) 
@Column(name = "contact_person") 
private String contactPerson; 
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation 
@Size(max = 255) 
private String email; 
// @Pattern(regexp="^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$", message="Invalid phone/fax format, should be as xxx-xxx-xxxx")//if the field contains phone or fax number consider using this annotation to enforce field validation 
@Size(max = 255) 
private String phone; 
@Column(name = "address_id") 
private Integer addressId; 
@Column(name = "category_id") 
private Integer categoryId; 
@Basic(optional = false) 
@NotNull 
@Column(name = "company_type") 
private boolean companyType; 
@Basic(optional = false) 
@NotNull 
private boolean approved; 
@Column(name = "user_id") 
private Integer userId; 
@Column(name = "who_can_watch") 
private Integer whoCanWatch; 
@Basic(optional = false) 
@NotNull 
@Column(name = "creation_date") 
@Temporal(TemporalType.TIMESTAMP) 
private Date creationDate; 
@Size(max = 255) 
private String razdel; 

public Advert() { 
} 

public Advert(Integer id) { 
    this.id = id; 
} 

AdvertProperty實體:

@Entity 
@Table(name = "advert_property") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "AdvertProperty.findAll", query = "SELECT a FROM AdvertProperty a"), 
    @NamedQuery(name = "AdvertProperty.findById", query = "SELECT a FROM AdvertProperty a WHERE a.id = :id"), 
    @NamedQuery(name = "AdvertProperty.findByAdvertId", query = "SELECT a FROM AdvertProperty a WHERE a.advertId = :advertId"), 
    @NamedQuery(name = "AdvertProperty.findByName", query = "SELECT a FROM AdvertProperty a WHERE a.name = :name"), 
    @NamedQuery(name = "AdvertProperty.findByValue", query = "SELECT a FROM AdvertProperty a WHERE a.value = :value"), 
    @NamedQuery(name = "AdvertProperty.findByDescr", query = "SELECT a FROM AdvertProperty a WHERE a.descr = :descr")}) 
public class AdvertProperty implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    private Integer id; 
    @Column(name = "advert_id") 
    private Integer advertId; 
    @Size(max = 255) 
    private String name; 
    @Size(max = 255) 
    private String value; 
    @Size(max = 255) 
    private String descr; 

回答

0

編輯

既然你已經從advert_propertyadvert外鍵,你可以模擬你的實體相應

廣告實體

... 
@OneToOne(mappedBy = "advert") 
private AdvertProperty property; 
// or this, in case it is one to many 
@OneToMany(mappedBy = "advert") 
private List<AdvertProperty> properties; 
... 

AdvertPropert Ÿ實體

@ManyToOne // or @OneToOne 
@JoinColumn("advert_id") 
private Advert advert; 

如果它是@OneToMany,查詢應該是這樣的

Query q = em.createQuery("SELECT a FROM Advert a join a.properties p where a.category = 'flats' and p.name='number_rooms' "); 

如果它是@OneToOne,查詢應該是這樣的

Query q = em.createQuery("SELECT a FROM Advert a where a.category = 'flats' and a.property.name='number_rooms' "); 
+0

不,我的財產主要是在另一張表,所以a.property.name - 它不會選擇任何東西,我不使用外鍵 – user2950593 2014-10-31 09:53:03

+0

有兩個實體之間的關係?你能在你的問題中發佈實體嗎?如果有關係(也有可能是基於'advert_property.advert_id')和'Advert'有一個像'AdvertProperty屬性的關係;',這個查詢會工作。 – 2014-10-31 09:55:52

+0

是,advert_property具有柱advert_id指向廣告。見entitites = UPD問題) – user2950593 2014-10-31 10:05:09

0

視你如何實現你的實體:

SELECT a FROM Advert a JOIN a.properties ap where a.category = 'flats' and ap.name='number_rooms' 

SELECT a FROM AdvertPropery ap JOIN ap.advert where a.category = 'flats' and ap.name='number_rooms' 

但是發表您的實體有一個確切的答案。


那不是如何JPA是應該做的一個映射,你應該使用關係註釋(@OneToMany,@ManyToOne,...)和映射註釋(@JoinColumn,@JoinTable,...)

無關係(和索引!),你唯一可以做的查詢是類似於您剛纔所做的事情:

SELECT DISTINCT ap FROM AdvertProperty ap, Advert a where a.category= 'flats' and ap.advertId = a.id and ap.name='number_rooms' 

不過這查詢不優化的(沒有索引...)和有一個非常糟糕的表現。

相關問題