我是 jpql 的新手。 我有两个 mySql 表。 表格广告:含列:
id, name, description, phone, category etc..
表 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;
最佳答案
取决于您如何实现实体:
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'
尽管如此,这个查询没有优化(没有索引...)并且性能非常糟糕。
关于java - jpql 根据另一个表中的某些属性从表中选择对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671600/