如何在Java中将PostgreSQl视图与休眠模式连接?

时间:2019-04-20 04:31:26

标签: java postgresql hibernate

我确实有一个Java Web应用程序,它确实使用Hibernate ORM进行数据库连接。有很多数据库表,主要配置为hibernate xml mapping files,即hbm.xml,其中每个文件都是数据库中的表。

现在的问题是,-数据库中有一个用postgreSQl创建的视图,我想在Java中使用该视图,该怎么做?如果我创建另一个hbm.xml文件,它将是在数据库中创建的表。我已经在互联网上阅读了一些有关如何将其与注释一起使用的示例,但是我没有在Web应用程序中对其进行配置。

Update1:​​

在对以下答案进行研究和建议后,这就是我的atm:

我为每个属性创建了xml映射文件和带有getter / setter的Java类:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"

>

<hibernate-mapping>
<class name="org.xxx.model.SearchView" table="search" mutable="false">

    <id name="uuId" column="uuid">

    </id>


    <property name="typeOfCRA" column="typeofcra" />

    <property name="birthDate" column="birthDate" />

    <property name="lastName" column="lastname" />

    <property name="firstName" column="firstname" />

    <property name="middleName" column="middlename" />

    <property name="recordId" column="recordid" />

    <property name="registrationDate" column="registrationdate" />

    <property name="state" column="state" />

    <property name="organisationunitId" column="organisationunitid" />

    <property name="version" column="version" />

    <property name="gender" column="gender" />


</class>
</hibernate-mapping>

这是我在Java中如何从数据库中获取结果列表的方式:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeofcra", "birth"));
List<SearchView> tmp =criteria.list();

它不会给出任何错误。根据我的标准,它一直返回0条记录。但是,当我使用相同的条件直接在Postgresql中将其过滤掉时,它将返回近60万个结果。

在编译或运行此代码片段期间,还存在0个错误。任何帮助表示赞赏。

Update2:

休眠conf文件:

connection.dialect = org.hibernate.dialect.PostgreSQLDialect
connection.driver_class = org.postgresql.Driver
connection.url = jdbc:postgresql://localhost:5432/finalDb
connection.username = postgres
connection.password = root
connection.schema = update

根据以下答案更新了代码:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%"));
List<SearchView> tmp =criteria.list();

在PgAdmin中直接调用有效:

SELECT typeofcra, dateofbirth, lastname, firstname, middlename, recordid, 
   registrationdate, state, organisationunitid, uuid, version, gender
 FROM public.search where typeofcra like '%birth%';

但是从Java上它不起作用。

4 个答案:

答案 0 :(得分:2)

根据上面发布的休眠映射文件,您在typeOfCRA实体中有SearchView字段。问题出在您的Restriction上。如果您想执行like操作,可以这样做

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%")); //Changed code here
List<SearchView> tmp =criteria.list();

上述查询将获取其中包含typeofcra 包含 birth的所有记录。如果要执行不区分大小写的搜索,则可以使用ilike限制。

  

更新

问题出在您的Hibernate映射文件名上。 Hibernate映射文件名应与您的实体/类名相同。您的SearchView类的休眠映射文件名称中存在拼写错误。从Searview.hbm.xml-> SearchView.hbm.xml更改文件名,它应该可以解决您的问题

答案 1 :(得分:0)

您可以创建要查看的实体并设置mutable="false"

<hibernate-mapping>
    <class name="com.MyView" mutable="false">
       <!--properties-->
    </class>
</hibernate-mapping>

然后使用

List<MyView> bvs = em.createQuery("SELECT v FROM MyView v", MyView.class).getResultList();

希望有帮助。

答案 2 :(得分:0)

如果可以使用注释,请尝试以下链接 https://thoughts-on-java.org/hibernate-tips-map-view-hibernate/

答案 3 :(得分:0)

它可以像任何表一样被映射。只需定义名称和列即可。标准表不是只读的,但是您不能对视图执行更新。您可以通过使用Hibernate的@Immutable注释来注释您的实体。

@Entity 
@Immutable 
public class MyCustomView { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 

    ...

}

如果您更改某些值,Hibernate现在将仅执行SELECT,而不执行UPDATE