从H2中的视图中选择不起作用

时间:2011-08-01 01:43:56

标签: h2

我最近用内存H2数据库替换了PostgreSql单元测试数据库。我无法弄清楚为什么几个测试失败,它与P​​ostgre一起工作正常。有约。本应用程序中有280多个单元测试。失败的dao测试是从视图中选择,实体具有EmbeddedId,即该视图的列。 请参阅下面的代码(注意:我在编写此电子邮件时更改了名称,代码和sql以隐藏真实姓名,但这是使用Postgre数据库的工作单元测试)

<pre>

@Table(name = "item_view") // <- item_view is a database view
public class ItemV implements Serializable
{
    .....
    @EmbeddedId // <- entity has an embedded id
    private ItemVId id;  
    .....

@Embeddable
    public static class ItemVId implements Serializable //<- This is the embeddedId
    {
        @Column(name = "item_id", updatable=false, insertable=false)
        private Long ItemId; //<- col no.1 of view

        @Column(name = "item_type_id", updatable=false, insertable=false)
        private Integer ItemTypeId; //<- col no.2 of view
    .....       
ItemType is an enum

And the view is
CREATE OR REPLACE VIEW item_view AS 
        (        (        (         SELECT pt.id as item_id, cit.id as item_type_id
                                   FROM xyz pt, item_type cit
                                  WHERE pt.name::text = 'xyz'::text
                        UNION 
                                 SELECT z.id as item_id, cit.id as item_type_id
                                   FROM zzz z, item_type cit
                                  WHERE z.name::text = 'zzz'::text)
                ..............

and the dao method is

    public ItemView find(Long itemId, ItemType itemType)
    {
        String hql = " from ItemV iv where iv.id.itemId = :itemId  and iv.id.itemTypeId = :itemTypeId ");
        List<ItemView> result = (List<ItemView>)getEntityManager()
            .createQuery(hql)
            .setParameter("itemId", itemId)
            .setParameter("itemTypeId", itemType.getId())
            .setMaxResults(1)
            .getResultList();
        return result.isEmpty()
            ? null : result.get(0);
    }

这个dao方法总是返回空结果,从不在视图中找到现有的行???我知道那些行存在,因为当我在相同的dao上执行getAll()时,我看到了结果,并且我看到了匹配的行标准。

在H2数据库中从视图中选择行有什么特别之处吗? 感谢

1 个答案:

答案 0 :(得分:1)

好的修复,我不得不使用较小的数字作为LOCK_TIMEOUT值,所以现在我可以连接到数据库并查看值。从视图问题中选择也已修复。

我不得不说H2真的很整洁。我很高兴,我将单元测试数据库切换到H2。