hibernate.QueryException:无法解析属性

时间:2013-02-07 21:19:46

标签: java hibernate

以下是此错误的另一个案例:

21:22:15,881 ERROR [SessionFactoryImpl] Error in named query: ch.software.gvs.TroubleNotification_DeviceType.byType org.hibernate.QueryException: 
could not resolve property: type of: ch.ildsoftware.gvs.TroubleNotification_DeviceType
[select d.id from ch.ildsoftware.gvs.TroubleNotification_DeviceType d where d.type = :type]

我有以下设置:

queries.xml:

<named-query name="ch.ildsoftware.gvs.TroubleNotification_DeviceType.byType">
    <query>
    select t.id from TroubleNotification_DeviceType t where t.type = :type
    </query>        
</named-query>

TroubleNotification_DeviceType.java

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "tblgwTroubleNotification_ADSTyp")
public class TroubleNotification_DeviceType implements Serializable {

private static final long serialVersionUID = 1L;

private TroubleNotification id;
private DeviceType type;
private String createdBy;
private String createdDate;

public TroubleNotification_DeviceType() 
{}

public TroubleNotification_DeviceType(TroubleNotification id, DeviceType type) {
    this.id = id;
    this.type = type;
}

@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDgwTroubleNotification", nullable = false)
public TroubleNotification getId() {
    return id;
}

public void setId(TroubleNotification id) {
    this.id = id;
}

@Id
@Column(name = "ADSTypID", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GeraeteTypID", nullable = false)
public DeviceType getType() {
    return type;
}

public void setType(DeviceType type) {
    this.type = type;
}

@Column(name = "Created", nullable = false)
public String getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(String createdBy) {
    this.createdBy = createdBy;
}

@Column(name = "CreatedDate", nullable = false)
public String getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(String createdDate) {
    this.createdDate = createdDate;
}
}

我怀疑@Column和@JoinColumn注释可能有问题。只是我加入的列名来自一个别名列名的视图。 但也许别的东西是错的。我对此很陌生。

从DeviceType中删除片段:

private static final long serialVersionUID = 1L;
private Integer id;
private String name;

    ....

@Id
@Column(name = "GeraeteTypID", nullable = false)
public Integer getId()
{
    return this.id;
}

在其他类中,引用将是这样的,并且运行良好(但列名相同):

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "GeraeteTypID", nullable = false)
public DeviceType getType()
{
    return this.type;
}

从EJB中获取片段:

@Override
@SuppressWarnings("unchecked")
public List<TroubleNotification> getTroubleNotificationByDeviceType(DeviceType aType)
{
    // first get all IDgwTroubleNotification for ADSTypID
    Query idSet = gvsData.createNamedQuery(
            TroubleNotification_DeviceType.class.getName() + ".byType");
    idSet.setParameter("type", aType);
    List<TroubleNotification> idSetResult = idSet.getResultList();

    final List<TroubleNotification> troubleNotificationResult = new ArrayList<TroubleNotification>();
    for (int i = 0; i <  idSetResult.size(); i++) {
        // get all Notification for IDgwTroubleNotification
        Query notificationById = gvsData.createNamedQuery(
                TroubleNotification.class.getName() + ".byId");
        notificationById.setParameter("id", idSetResult.get(i));
        troubleNotificationResult.add((TroubleNotification) notificationById.getResultList());
    }
    return troubleNotificationResult;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现我的数据库映射完全没有问题。我有一个n:m的关系,这看起来不像是一个简单的hibernate。但这非常有用: Hibernate Many-To-Many Revisited

但那仍然没有解决问题。我发现我有复合主键,两个表的主键映射在n:m表中。另一个不太容易的设置。所以我按照这个帖子:Mapping ManyToMany with composite Primary key and Annotation:

来自第二个链接的配置,以及根据第一个链接中第二个策略的SQL语句。