I want have two entities
#Entity
public class User {
#Index private String email;
#Index private String name;
#Index private String age;
}
#Entity
public class poll {
#Index private String pollid;
#Index private String answer;
#Index private Ref<User> user;
}
Now if I want to query poll and filter by email I m getting empty. Is it possible?
ofy().load().type(Poll.class).filter("email", email).list();
You can not do "indirect" queries on GAE (e.g. A JOIN type queries). Basically, your "poll" entity does not have the "email" field.
Related
I'm moving from multiple cores to a single core with nested documents.(reason being matching/scoring from multiple cores is limited)
To achieve this I'm trying to index a nested structure using solrJ.
I've tested the following code but I get an error "BookDetail cannot have more than one Field with child=true"
How can I avoid this? Is this a solrj limitation?
Indexing is done as followed:
- Solr and solrj version 5.3.1
HttpSolrClient mytestcore=new HttpSolrClient("...");
mytestcore.add(dob.toSolrInputDocument(new Book());//should have some initialization
The structure is below(but most unused fields are removed).
public class Book implements Serializable {
#Field
private String id;
#Field
private String type;
#Field(child = true)
private List<BookDetail> details;
...
}
public class BookDetail implements Serializable {
#Field
private String id;
#Field
private String type;
#Field(child = true)
private List<BookMetaData> bookMetaData;
#Field(child = true)
private List<BookContent> pages;
...
}
public class BookMetaData implements Serializable {
#Field
private String id;
#Field
private String type;
...
}
public class BookContent implements Serializable {
#Field
private String id;
#Field
private String type;
#Field
private String content;
...
}
Edit:
Currently solved it by making seperate SolrInputDocuments for each document type and add them with addChildDocument.(as seen on other answers on stackoverflow) But this solution doesn't use the annotation "child = true" anymore...
Can someone help me how should I join those three tables using JPA?
I already did 2 of 3 entities but please let me know if are ok:
#Entity
public class Pacienti {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String nume;
private String prenume;
//setters & getters
}
#Entity
public class Chestionare {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private int id;
#Id
#Column(name = "id_intrebare")
#GeneratedValue(strategy = GenerationType.AUTO)
private int idIntrebare;
private String intrebare;
//setters & getters
}
As I promise I come back after I'm generating entities automatically. Unfortunately now I have another problem.
Now I have the entity:
#Entity
#Table(name = "pacienti")
#NamedQuery(name = "Pacienti.findAll", query = "SELECT p FROM Pacienti p")
public class Pacienti implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
#Column(unique = true, nullable = false)
private int id;
#Column(nullable = false, length = 20)
private String nume;
#Column(nullable = false, length = 20)
private String prenume;
// bi-directional many-to-one association to Consultatii
#OneToMany(mappedBy = "pacienti")
private List<Consultatii> consultatiis;
// bi-directional many-to-one association to DetaliiPacient
#OneToMany(mappedBy = "pacienti")
private List<DetaliiPacient> detaliiPacients;
// bi-directional many-to-one association to Doctori
#ManyToOne(fetch = FetchType.LAZY)
#JoinColumn(name = "id_doctor", nullable = false)
private Doctori doctori;
// bi-directional many-to-one association to RaspunsChestionar
#OneToMany(mappedBy = "pacienti")
private List<RaspunsChestionar> raspunsChestionars;
public Pacienti() {
}
//setters and getters
}
But when I do :
Query queryResult = sessionFactory.getCurrentSession().createQuery("from Pacienti");
I'm getting:
Pacienti is not mapped [from Pacienti] Error.
Can someone tell me why? I also tried "pacienti is not mapped [from pacienti]" but same result
Thank you!
I would recommend you to use the jpa tools/plugins available with the IDEs which will auto generate these jpa entities for you using the database tables rather than manually creating these.
And they will take care of setting the relationship b/w different entities(db tables) in the auto generation process itself.
If you are Eclipse you can achieve this.
The problem is bcz there is no query with the name "from pacienti" in place of that pass the query name "Pacienti.findAll" in your createQuery method.
Plz let ne know once you try this, if you face any problem
I have the following tableS:
`notification_job_execution`
(`jobId`,
`createdDate`,
`messageBody`)
`notification_task_execution`
(`taskId`,
`jobId`,
`status`,
`createdDate`)
Havin oneToMany relationshop (notification_job_execution ,notification_task_execution)
(1..n)
I have the following entities
#Id
#GeneratedValue(strategy= GenerationType.AUTO)
private String jobId;
#Temporal(TemporalType.DATE)
private Date createdDate;
private String messageBody;
#OneToMany(fetch = FetchType.LAZY, mappedBy = "notificationJobEntity", cascade=CascadeType.ALL)
private Set<NotificationTaskEntity> notificationTaskEntities = new HashSet<NotificationTaskEntity>(
0);
and:
#Entity
#Table(name = "notification_task_execution")
public class NotificationTaskEntity implements Serializable{
#Id
#GeneratedValue(strategy= GenerationType.AUTO)
private long taskId;
private int jobId;
private String status;
#Temporal(TemporalType.DATE)
private Date createdDate;
#ManyToOne(optional = false)
private NotificationJobEntity notificationJobEntity;
I am using Spring and JPA in order to persist this way:
NotificationJobEntity notificationJobEntity=new NotificationJobEntity();
notificationJobEntity.setCreatedDate(new Date());
notificationJobEntity.setMessageBody("hello youu");
NotificationTaskEntity notificationTaskEntity=new NotificationTaskEntity();
notificationTaskEntity.setCreatedDate(new Date());
notificationTaskEntity.setStatus("success");
notificationTaskEntity.setNotificationJobEntity(notificationJobEntity);
notificationTaskEntity.setNotificationJobEntity(notificationJobEntity);
notificationJobEntity.getNotificationTaskEntities().add(notificationTaskEntity);
notificationDao.save(notificationJobEntity);
I cant see in the database the child record persisted ( which is notificationTaskEntity).
How could I persist the parent and under the hood having the notificationTaskEntity to be persisted to the database as well?
I think you may just need to add the #JoinColumn annotation to indicate which field in the database table represents the ID of the NotificationTaskEntity.
#ManyToOne(optional = false)
#JoinColumn(name = "jobid")
private NotificationJobEntity notificationJobEntity;
You must specify the CascadeType in the NotificationTaskEntity
#ManyToOne(optional = false,CascadeType.PERSIST)
private NotificationJobEntity notificationJobEntity;
I have a Java model similar to:
public class Country {
#Id private String id;
private CurrencyId currencyId;
private List<Province> provinceList;
...
}
public class Province {
#Id private String id;
private Gobernor gobernorId;
private List<City> cityList;
...
}
public class City {
#Id private String id;
private String name;
...
}
I want to store that data using objectify. However, as Country data might change, I also want to store the date the Country data has been stored, so I think I should store an entity such as:
public class CountryListEntity {
#Id private String id;
private List<Country> countryList;
private Date storeDate;
}
Note I will only have one entity of kind CountryListEntity with the Id "root", if I can store it like that. I know very little about both how google apps stores data and how objectify works. I've tried many combinations of #Embedded, but I got many errors, i.e.
Cannot place array or collection properties inside #Embedded arrays or collections
Can anyone tell me how to define these classes? A snippet of the code needed to store and retrieve this "root" entity, would be highly appreciated!
#Embedded collections are transformed into a series of collection fields in the
low-level Entity. That's why one level embedding is all you can do.
If you are going to store/load all data at once and if your entities are as simple as the ones in your example you can put #Serialized annotation for your lists inside #Embedded lists.
You can find out more from this discussion.
The problem with this approach is that your low-level embeddings won't be able to be indexed.
public class CountryListEntity {
#Id private String id;
#Embedded
private List<Country> countryList;
private Date storeDate;
}
public class Country implements Serializable {
private String id;
private CurrencyId currencyId;
#Serialized
private List<Province> provinceList;
// ...
}
public class Province implements Serializable {
private String id;
private Gobernor gobernorId;
#Serialized
private List<City> cityList;
// ...
}
public class City implements Serializable {
private String id;
private String name;
// ...
}
I am not sure if I use the #Id in objectify the right way.
Right now I am using the eMail-Address as #Id field. The email field will be set on the server-side only (OAuthService.getCurrentUser.getEmail)
First question: Is this a good idea?
If I create for example an Item-class which has RegistrationTO as it's parent does it make sense to use the email-address as the #Id field in my Item-class or should Item-class have it's own, auto-generated, id and Key parent to specify the relation?
Objectify-Tutorial recommends to avoid #Parent - so, here I think it's not necessary either.
I am right?
Here my RegistrationTO:
public class RegistrationTO implements Serializable {
private static final long serialVersionUID = 1L;
#NotNull
#Size(min = 5, max = 20)
private String firstname;
#NotNull
#Size(min = 5, max = 20)
private String name;
#NotNull
#Size(min = 5, max = 20)
private String country;
#Id
#NotNull
#Size(min = 5, max = 20)
#Pattern(regexp = "\b[A-Z0-9._%-]+#[A-Z0-9.-]+\\.[A-Z]{2,4}\b")
private String email;
public RegistrationTO() {
}
public RegistrationTO(final String firstname, final String name, final String company) {
this.firstname = firstname;
this.name = name;
this.country = country;
email = "will be set on server (Oauth)";
}
public String getFirstname() {
return firstname;
}
public String getName() {
return name;
}
public String getCountry() {
return country;
}
public String getEmail() {
return email;
}
public void setEmail(final String email) {
this.email = email;
}
}
Sample for Item class:
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
#Id
Long id
//or
//#Id
//String email
Key<RegistrationTO> parent;
String itemno;
}
Thank you in advance!
Regarding your question if the use of e-mail as #Id is correct or not, since the email will uniquely identify each object of the class, then you are fine!
Now, regarding the #Id of your Item class, if the email uniquely identifies each object, then there is no need to create a new auto-generated Long as #Id. In general, the criterion for the selection of the #Id is to uniquely identify all the objects of the class.
For the relationship between RegistrationTO and Item classes, use the #Parent annotation only if you need these entities to be the same entity group. The code for this:
#Parent
Key<RegistrationTO> parent;
Otherwise, use a "plain" relationship (as you have it in your example) that allows RegistrationTO and Item entities to be stored in different entity groups in the GAE datastore. For more information about entity groups, take a look at:
http://code.google.com/appengine/docs/java/datastore/entities.html#Entity_Groups_and_Ancestor_Paths
Hope that helps!