@@ -47,16 +47,34 @@ public Object bind(RootParamNode rootParamNode, String name, Class clazz, java.l
47
47
48
48
ParamNode paramNode = rootParamNode .getChild (name , true );
49
49
50
- String keyName = Model .Manager .factoryFor (clazz ).keyName ();
51
- String [] ids = paramNode .getChild (keyName , true ).getValues ();
50
+ String [] keyNames = new JPAModelLoader (clazz ).keyNames ();
51
+ ParamNode [] ids = new ParamNode [keyNames .length ];
52
+ // Collect the matching ids
53
+ int i = 0 ;
54
+ for (String keyName : keyNames ) {
55
+ ids [i ++] = paramNode .getChild (keyName , true );
56
+ }
52
57
if (ids != null && ids .length > 0 ) {
53
58
try {
54
- Query query = JPA .em ().createQuery ("from " + clazz .getName () + " o where o." + keyName + " = ?" );
59
+ EntityManager em = JPA .em ();
60
+ String q = "from " + clazz .getName () + " o where" ;
61
+ for (String keyName : keyNames ) {
62
+ q += " o." + keyName + " = ? and " ;
63
+ }
64
+ if (q .length () > 4 ) {
65
+ q = q .substring (0 , q .length () - 4 );
66
+ }
67
+ Query query = em .createQuery (q );
55
68
// The primary key can be a composite.
56
- int i = 1 ;
57
- Class pk = Model .Manager .factoryFor (clazz ).keyType ();
58
- for (String id : ids ) {
59
- query .setParameter (i ++, Binder .directBind (rootParamNode .getOriginalKey (), annotations , id , pk , null ));
69
+ Class [] pk = new JPAModelLoader (clazz ).keyTypes ();
70
+ int j = 0 ;
71
+ for (ParamNode id : ids ) {
72
+ if (id .getValues () == null || id .getValues ().length == 0 ) {
73
+ // We have no ids, it is a new entity
74
+ return GenericModel .create (rootParamNode , name , clazz , annotations );
75
+ }
76
+ query .setParameter (j + 1 , Binder .directBind (id .getOriginalKey (), annotations , id .getValues ()[0 ], pk [j ++], null ));
77
+
60
78
}
61
79
Object o = query .getSingleResult ();
62
80
return GenericModel .edit (rootParamNode , name , o , annotations );
0 commit comments