我确实有一个java Web应用程序,它确实使用Hibernate ORM进行数据库连接。有很多数据库表,主要配置为hibernate xml mapping files
,即hbm.xml
,其中每个文件都是数据库中的一个表。
现在的问题是,-数据库中有一个使用postgreSQl创建的视图,我想在java中使用该视图,该怎么做?如果我创建另一个hbm.xml
文件,该文件将成为在数据库中创建的表。我已经在互联网上阅读了有关如何将其与注释一起使用的示例,但我没有在我的 Web 应用程序中配置它。
更新1:
经过对以下答案的一些研究和推荐,这就是我所拥有的 atm:
我创建了xml
映射文件和一个 java 类,每个属性都有 getter/setters:
<?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
中过滤掉它时,它会返回近 600k 个结果。
在编译或运行此代码片段期间,也有 0 个错误。任何帮助,不胜感激。
更新2:
休眠会议文件:
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中它不起作用。
根据上面发布的休眠映射文件,您在SearchView
实体中typeOfCRA
字段。问题出在您的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
限制。
更新
问题出在您的休眠映射文件名上。休眠映射文件名应与实体/类名相同。SearchView 类的休眠映射文件名中存在拼写错误。将文件名从Searview.hbm.xml
->SearchView.hbm.xml
更改为 ,它应该可以解决您的问题
您可以创建用于视图的实体并设置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();
希望对您有所帮助。
如果可以使用注释,请尝试以下链接 https://thoughts-on-java.org/hibernate-tips-map-view-hibernate/
它可以像任何表一样映射。只需定义名称和列。标准表不是只读的,但您无法对视图执行更新。您可以通过使用 Hibernate 的@Immutable
注释来注释您的实体来做到这一点。
@Entity
@Immutable
public class MyCustomView {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
...
}
休眠现在将只执行SELECT
,但如果您更改某些值,则不会UPDATE
。