使用Endeded对象进行条件查询

时间:2014-08-28 02:13:22

标签: hibernate

以下是我的Pojos

@Entity
@Table(name = "XXXXXXXX")
public class MyDTO1 implements Serializable{

@Embeded
private MyDTO2 myDTO2;
private Integer int1;
}

@Embedable
public class MyDTO2 implements Serializable{

private String string1;
}

实际班级:

pulic class Test(){

private void testMethod(){
Session session = getSession();
List<ClientProgramINDTO> clientProgramDto = session.createCriteria(ClientProgramINDTO.Class)
.add(Restrictions.eq("int1", 1))
.add(Restrictions.eq("myDTO2.string1", "Test")).list();
}


}

我收到以下错误消息:

could not resolve property myDTO2.string1  in MyDto1.

2 个答案:

答案 0 :(得分:0)

解决方法是使用metamodel

我希望this解决您的问题。详细解释一下。

答案 1 :(得分:0)

您的代码中存在一些错误:

实体@Embeded

@Embedded应为MyDTO1 实体@Embedable

@Embeddable应为MyDTO2

pulic class Test(){应为public class Test{

ClientProgramINDTO.Class应为ClientProgramINDTO.class

因此,如果不修复这些编译问题,则无法运行该程序。

此外,您尚未提供ClientProgramINDTO对象是什么以及它与其他实体的关系,我假设ClientProgramINDTOMyDTO1相同。

如果我根据我的假设继续进行,那么代码中就没有问题。以下是我尝试过的示例代码:

public class Test {
    public static void main(String[] args) {
        saveData();
        testMethod();
        HibernateUtil.getSessionFactory().close();
    }
    private static void saveData() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();

        ClientProgramINDTO c = new ClientProgramINDTO();
        c.setInt1(1);
        c.setMyDTO2(new MyDTO2("Test"));
        session.save(c);

        session.getTransaction().commit();
    }
    private static void testMethod() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
        List<ClientProgramINDTO> clientProgramDto = session
                .createCriteria(ClientProgramINDTO.class)
                .add(Restrictions.eq("int1", 1))
                .add(Restrictions.eq("myDTO2.string1", "Test")).list();
        for (ClientProgramINDTO clientProgramINDTO : clientProgramDto) {
            System.out.println(clientProgramINDTO.getInt1() + " "+ clientProgramINDTO.getMyDTO2().getString1());

        }
        session.getTransaction().commit();      
    }
}

此计划的输出:

1测试