java - jpql 根据另一个表中的某些属性从表中选择对象?

标签 java mysql jsf jpa jpql

我是 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/

相关文章:

java - 将十六进制字符串解析为 int 值时出现意外的 NumberFormatException

java - 实例化新 Activity 会导致应用程序崩溃

PHP数据库未添加数据

php - MySQL:统计A月到B月的数据

jsf - 将参数传递给 primefaces inputtextarea 控件的完整方法

java - JSF 移动/重定向到其他包含数据的页面

java - 是否可以配置字符串生成器,使得附加函数不会在附加之前将数据转换为字符串

java - 在新的浏览器选项卡中打开 ResponseEntity PDF

内容中出现新行的 MySQL INTO OUTFILE 问题

java - 如何集成 Spring 和 JSF