inner join between two tables Hibernate - java

I need to do Inner join between two tables, but without success, I have to find all the patients related to a particular User,I tried to query without success.
I am using mysql and hibernate 3.6.4.
This is my code
Patient.java
#Entity
public class Patient {
#Id
private int id;
private String paitentFirstName;
private String paitentLastName;
private Date dateOfbirth;
private String sex;
#ManyToMany(cascade = {CascadeType.ALL})
#JoinTable(name="User_Patient",
joinColumns={#JoinColumn(name="id")},
inverseJoinColumns={#JoinColumn(name="userName")})
private Set<User> users = new HashSet<User>();
public Set<User> getUsers() {
return users;
}
public void setMeetings(Set<User> users) {
this.users = users;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPaitentFirstName() {
return paitentFirstName;
}
public void setPaitentFirstName(String paitentFirstName) {
this.paitentFirstName = paitentFirstName;
}
public String getPaitentLastName() {
return paitentLastName;
}
public void setPaitentLastName(String paitentLastName) {
this.paitentLastName = paitentLastName;
}
public Date getDateOfbirth() {
return dateOfbirth;
}
public void setDateOfbirth(Date dateOfbirth) {
this.dateOfbirth = dateOfbirth;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
#Override
public String toString() {
return "Patient [id=" + id + ", paitentFirstName=" + paitentFirstName
+ ", paitentLastName=" + paitentLastName + ", dateOfbirth="
+ dateOfbirth + ", sex=" + sex + "]";
}
}
User.java
#Entity
public class User {
#Id
private String UserName;
#ManyToMany(mappedBy="users")
private Set<Patient> patients = new HashSet<Patient>();
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public Set<Patient> getEmployees() {
return patients;
}
public void setEmployees(Set<Patient> patients) {
this.patients = patients;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
}
Hibernate configuration file
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test2</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- Names the annotated entity class -->
<mapping class="com.objects.Patient"/>
<mapping class="com.objects.User"/>
</session-factory>
</hibernate-configuration>

There is no need for explicit join.
With Hibernate version that do have HHH-5209 fixed, query can be written as follows:
SELECT p
FROM Patient p
WHERE :particularUser MEMBER OF p.users
With older versions IN ELEMENTS can be used instead:
SELECT p
FROM Patient p
WHERE :particularUser IN ELEMENTS (p.users)

Related

How to aggregate functions in HIbernate

I am using "select max(pid) from Patient p" in hibernate using spring mvc framework and it is showing "Stacktrace:] with root cause
org.hibernate.hql.internal.ast.QuerySyntaxException: Patient is not mapped" and lots more error. Why???
<%
Configuration cfg = new Configuration();
cfg.configure("doc.cfg.xml");
SessionFactory sf = cfg.buildSessionFactory();
Session s = sf.openSession();
Query q = s.createQuery("select max(pid) from Patient p");
List lst = q.list();
%>
Actually I want the value
<%=lst %>
and want to get the max of pid from my POJO class Patient from the database patient having pid as integer values.
patient.java
package dao;
public class patient {
private String ppass , pname , mob , age , sex , addr;
private int pid;
public String getPpass() {
return ppass;
}
public void setPpass(String ppass) {
this.ppass = ppass;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getMob() {
return mob;
}
public void setMob(String mob) {
this.mob = mob;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
}
and
doc.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name=
"connection.url">jdbc:mysql://localhost:3306/doctoapp</property>
<property name="connection.username">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<!-- student class ka mapping -->
<mapping resource="doc.hbm.xml"/>
<mapping resource="pat.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Hibernate can't find my hibernate.cfg.xml file

Pretty stupid/simple question. Doing an assignment and hibernate can't find my hibernate.cfg.xml file. I'm using IntelliJ and it is located inside my src folder. See my code below.
Main:
public class Main {
public static void main(String[] args) {
Employee tempEmployee = new Employee("Ronald", "Customer Service", true);
EmployeeDAO employeeDAO = new EmployeeDAO();
employeeDAO.saveEmployee(tempEmployee);
}
}
DAO:
public class EmployeeDAO {
SessionFactory sessionFactory = new Configuration()
.configure()
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
public void saveEmployee(Employee employee){
Session session = sessionFactory.getCurrentSession();
try {
session.beginTransaction();
session.save(employee);
session.getTransaction().commit();
} finally {
session.close();
}
}
}
Entity:
#Entity
#Table(name = "employee")
public class Employee {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "id")
private long id;
#Column(name = "name")
private String name;
#Column(name = "department")
private String department;
#Column(name = "working")
private boolean working;
public Employee(){}
public Employee(String name, String department, boolean working) {
this.name = name;
this.department = department;
this.working = working;
}
#Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", department='" + department + '\'' +
", working=" + working +
'}';
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public boolean isWorking() {
return working;
}
public void setWorking(boolean working) {
this.working = working;
}
}
Hibernate config:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/employee</property>
<property name="connection.username">employee</property>
<property name="connection.password">employee</property>
<property name="dialect">com.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
add configuration.configure("classpath:com/resources/hibernate.cfg.xml"); this will locate your hibernate cfg.xml file also
read this tutorial
Mark your resources folder as resources from INTELLIJ IDEA.
Go to: File->Project Structure to do it.
Hope, it helps.
Put your XML configuration file hibernate.cfg.xml under src/main/resources.
Also you can add it manually using File → Project Structure → Add → Hibernate:
And then add a descriptor in the same window as:
specify the path to your descriptor and press OK.

MySQL table not mapped by Hibernate 5+

I'm trying to learn Hibernate using MySQL built-in database named world. It has three tables called city, country and countrylanguage. What I'm trying to do is execute SQL statement SELECT * FROM world.city;. When I run my project I'm getting error
org.hibernate.hql.internal.ast.QuerySyntaxException: City is not mapped [from City]
I'm using IntelliJ IDEA and Hibernate 5.2.8.
I created mapping xml file like this:
<?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 package="pl.hibernatePackage">
<class name="City" table="city">
<id name="id" column="ID" type="int">
<generator class="native"/>
</id>
<property name="name" column="Name" type="string"/>
<property name="countryCode" column="CountryCode" type="string"/>
<property name="district" column="District" type="string"/>
<property name="population" column="Population" type="int"/>
</class>
</hibernate-mapping>
City.java is presented below:
public class City
{
private Integer id;
private String name;
private String countryCode;
private String district;
private Integer population;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
public Integer getPopulation() {
return population;
}
public void setPopulation(Integer population) {
this.population = population;
}
}
I'm creating session in HibernateUtil.java
public class HibernateUtil
{
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure();
StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
standardServiceRegistryBuilder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = standardServiceRegistryBuilder.build();
return configuration.buildSessionFactory(serviceRegistry);
}
catch(Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Configuration file
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property>
<property name="hibernate.connection.username">test</property>
<property name="hibernate.connection.password">1234</property>
<property name="connection.pool_size">1</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">false</property>
<property name="hbm2ddl.auto">update</property>
<!-- List of XML mapping files -->
<mapping resource="pl/hibernatePackage/City.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Main
public class Main
{
public static void main(String[] args)
{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<City> cities = session.createQuery("from City").list();
for(City c : cities) {
System.out.println(c.getId() + "\t" + c.getName() + "\t" + c.getCountryCode() + "\t" + c.getDistrict() +
"\t" + c.getPopulation());
}
session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
}
}
EDIT Full error list
EDIT 2
javac result
I have done some testing and i made it work by using the fully qualified class name:
session.createQuery("from pl.hibernatePackage.City")
Now this is only a workaround without touching your config..
After digging deeper i found out that since hibernate version 5.x, there is a different strategy for building the sessionFactory.
I made your example work by implementing sessionFactory as follows:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure()
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.getMetadataBuilder()
.build();
return configuration.buildSessionFactory(serviceRegistry);
This is explained with example here: jboss documentation (point 2.4)
Thanks to Maciej's answer and help of other guys I managed to get my example to work by modifying code and cleaning it up a little. I also found out that mapping DB with xml file is outdated so I modifiied properly CityEntity class. Final code:
Main.java
import org.hibernate.Session;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
Session session = HibernateUtil.getSession();
session.beginTransaction();
List<CityEntity> cities = session.createQuery("from CityEntity").list();
for(CityEntity c : cities)
{
System.out.println(c.getId() + "\t" + c.getName() + "\t" + c.getCountryCode() + "\t" + c.getDistrict() +
"\t" + c.getPopulation());
}
session.getTransaction().commit();
HibernateUtil.close();
}
}
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="connection.pool_size">1</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- List of mapped classes -->
<mapping class="CityEntity"/>
</session-factory>
</hibernate-configuration>
HibernateUtil.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil
{
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure();
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure()
.build();
return configuration.buildSessionFactory(standardRegistry);
}
catch(Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Session getSession()
{
return sessionFactory.openSession();
}
public static void close()
{
sessionFactory.close();
}
}
CityEntity.java
import javax.persistence.*;
#Entity
#Table(name = "city", schema = "world")
public class CityEntity
{
private int id;
private String name;
private String countryCode;
private String district;
private int population;
#Basic
#Column(name = "CountryCode")
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
#Id
#Column(name = "ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
#Basic
#Column(name = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#Basic
#Column(name = "District")
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
#Basic
#Column(name = "Population")
public int getPopulation() {
return population;
}
public void setPopulation(int population) {
this.population = population;
}
}

Hibernate: alter table User_Address drop foreign key FK_im39k3og2pvx7vvqdcy35s0g0

when i ran my code at first it worked correctly but later i am unable access those
tables?
Here is my code:-
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/navlic</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping class="dto.UserDetails"/>
</session-factory>
</hibernate-configuration>
Main class:-
package dto;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GenerationType;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateTest {
public static void main(String[] args) {
UserDetails ud=new UserDetails();
ud.setUserName("Second user");
Address homead=new Address();
homead.setCity("smg");
homead.setCountry("aa");
homead.setHouse("bb");
homead.setStreet("cc");
homead.setState("dd");
Address officead=new Address();
officead.setCity("smg");
officead.setCountry("ee");
officead.setHouse("ff");
officead.setStreet("gg");
officead.setState("hh");
ud.getAddr().add(homead);
ud.getAddr().add(officead);
SessionFactory sf;
ServiceRegistry sr;
Configuration cfg=new Configuration().configure();
sr=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sf=cfg.buildSessionFactory(sr);
Session s=sf.openSession();
s.beginTransaction();
s.save(ud);
s.getTransaction().commit();
s.close();
ud=null;
s=sf.openSession();
//if type is lazy it returns only the variables of that class no more reference variables.
//if type is Eager it returns all the elements of user class
ud=(UserDetails)s.get(UserDetails.class, 1);
System.out.println(ud.getAddr().size());
}
}
Model class:-
#Entity
public class UserDetails {
#Id
#GeneratedValue(strategy=GenerationType.AUTO)
private int UserId;
private String UserName;
#ElementCollection(fetch=FetchType.EAGER)
#JoinTable(name="User_Address",joinColumns=#JoinColumn(name="User_Id"))
#GenericGenerator(name="hilo-gen" ,strategy="hilo")
#CollectionId(columns={#Column(name="AddressId")},generator="hilo-gen",type=#Type(type="long"))
private Collection<Address> addr=new ArrayList<Address>();
public Collection<Address> getAddr() {
return addr;
}
public void setAddr(Collection<Address> addr) {
this.addr = addr;
}
public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
}
Address class is here :-
#Embeddable
public class Address {
#Column(name="Office_name")
private String House;
public String getHouse() {
return House;
}
public void setHouse(String house) {
House = house;
}
public String getStreet() {
return Street;
}
public void setStreet(String street) {
Street = street;
}
public String getCity() {
return City;
}
public void setCity(String city) {
City = city;
}
public String getState() {
return State;
}
public void setState(String state) {
State = state;
}
public String getCountry() {
return Country;
}
public void setCountry(String country) {
Country = country;
}
#Column(name="street_name")
private String Street;
#Column(name="city_name")
private String City;
#Column(name="state_name")
private String State;
#Column(name="country_name")
private String Country;
}
when i try to run my code there is no error from hibernate but an mysql error is encountered I am new to mysql can anyone explain me in deatil the cause of this error and how to fix it.
thanks in advance

how to ignore a field in entity class for create table in mysql database?

I have a simple hibernate sample that have an entity class. I add a field to entity class that i don't want to create a column for that field in table of database. how can i do that?
my Entity class:
#Entity
#Table(name = "person")
public class PersonEntity {
private Long id;
private String emailEntity;
private String nameEntity;
private String familyEntity;
private String cityEntity;
private String phoneEntity;
private Long orgId;
private String province;
#Id
#GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
#Column(name = "email")
public String getEmailEntity() {
return emailEntity;
}
public void setEmailEntity(String emailEntity) {
this.emailEntity = emailEntity;
}
#Column(name = "name")
public String getNameEntity() {
return nameEntity;
}
public void setNameEntity(String nameEntity) {
this.nameEntity = nameEntity;
}
#Column(name = "last_name")
public String getFamilyEntity() {
return familyEntity;
}
public void setFamilyEntity(String familyEntity) {
this.familyEntity = familyEntity;
}
#Column(name = "city")
public String getCityEntity() {
return cityEntity;
}
public void setCityEntity(String cityEntity) {
this.cityEntity = cityEntity;
}
#Column(name = "phone")
public String getPhoneEntity() {
return phoneEntity;
}
public void setPhoneEntity(String phoneEntity) {
this.phoneEntity = phoneEntity;
}
#Column(name = "org_id")
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
}
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/emailDB</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">false</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--<mapping class="net.viralpatel.hibernate.Employee"/>-->
<!--<mapping class="net.viralpatel.hibernate.PersonEntity"/>-->
<mapping class="organizationsTab.PersonEntity"/>
<mapping class="organizationsTab.OrgEntity"/>
</session-factory>
</hibernate-configuration>
'province' field is an auxiliary field and I don't want to create a column for that in table. how can i do that?
Annotate the field with #Transient annotation See more here
Every non static non transient property (field or method depending on the access type) of an entity is considered persistent, unless you annotate it as #Transient.
public transient int counter; //transient property
private String firstname; //persistent property
So you can use #Transient annotation on the property you do not wish to create a column for in database.

Categories